23,121
社区成员
发帖
与我相关
我的任务
分享
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;
}