日期:2014-05-16 浏览次数:20941 次
char charset[16] = {0};
// =?UTF-8?B?5o6i57Si56We5puy6ZqQ6JeP5Zyo6IOM5ZCO55qE56eY5a+G?=
bool decode_subject(char *subject)
{
    static char *iconvob = NULL;
    static iconv_t cd = (iconv_t)-1;
    char *p1, *p2;
    size_t insz, outsz;
    if(!strstr(subject, "=?"))
        return true;
    p1 = strchr(subject + 2, '?');
    memcpy(charset, subject + 2, p1 - subject - 2);
    charset[p1 - subject - 2] = 0;
#ifdef DEBUG
    fprintf(stderr, "charset: %s\n", charset);
#endif
    p1 += 3;
    p2 = strrchr(p1, '?');
    if(cd == (iconv_t)-1) {
        cd = iconv_open("UTF-8", charset);
        if(cd == (iconv_t)-1) {
            perror("iconv_open()");
            return false;
        }
    }
    if(!iconvob) {
        iconvob = (char *)malloc(256);
        if(!iconvob) {
            fprintf(stderr, "malloc() failed\n");
            return false;
        }
    }
    memset(iconvob, 0, 256);
    insz = p2 - p1;
    if(iconv(cd, &p1, &insz, &iconvob, &outsz) == (size_t)-1) {
        iconv_close(cd);
        perror("iconv()");
        return false;
    }
    strcpy(subject, iconvob);
    return true;
}