最近遇到一个问题,outlook接收邮件乱码,一般乱码几本上都是编码问题,换了utf-8等一些编码发现还是乱码,打开乱码邮件一看发现charset=iso-2022-cn,从来没见过这种编码,几经折腾发现原来这是Apple操作系统带的一种编码,上网查了下,发现这东西在国内使用的很少,尤其是在Windows平台上,根本没提供现成的解码函数。以下是本人在网上找到的一个解码函数,贴出来做个mark。
//ISO-2022-CN - 中文
// ESC $ ) A 转为GB 2312-1980
// ESC $ ) G 转为CNS 11643-1992第一字面
// ESC $ * H 转为CNS 11643-1992第二字面
//ISO-2022-CN-EXT - 于ISO-2022-CN的基础上,加上以下六组逃逸字串
// ESC $ ) E 转为ISO-IR-165
// ESC $ + I 转为CNS 11643-1992第三字面
// ESC $ + J 转为CNS 11643-1992第四字面
// ESC $ + K 转为CNS 11643-1992第五字面
// ESC $ + L 转为CNS 11643-1992第六字面
// ESC $ + M 转为CNS 11643-1992第七字面
CString CTaiyanWebString::Iso2022cn2Gbk(const char *pSrc)
{
CStringA strDest;
char *pDest = strDest.GetBufferSetLength(strlen(pSrc));
bool bIsConvert = false;
while(*pSrc)
{
switch(*pSrc)
{
case 0x1b: // <ESC> 字符集信息
pSrc += 4; // 字符集信息此处未做处理,建议以后补上
break;
case 0x0e: // <SO> 转换开始
++pSrc;
bIsConvert = true;
break;
case 0x0f: // <SI> 转换结束
++pSrc;
bIsConvert = false;
break;
default:
*pDest++ = bIsConvert ? (*pSrc++ | 0x80) : (*pSrc++);
break;
}
}
*pDest = 0;
strDest.ReleaseBuffer();
return CString(strDest);
}