将ISO-2022-CN字符集转换成GBK的源代码

来源:互联网 发布:mac同时打开两个窗口 编辑:程序博客网 时间:2024/05/01 16:40

将ISO-2022-CN字符集转换成GBK的源代码

吴旻

泰岩网络工作室

 

         同事用的是Apple操作系统,发出来的邮件在我的系统中经常会有乱码。仔细看了下邮件内容,发现是邮件中使用的字符集是ISO-2022-CN。上网查了下,发现这东西在国内使用的很少,尤其是在Windows平台上,根本没提供现成的解码函数。想找个开源的相关代码,翻了半天,未果。

         今天有空,终于抽出时间写出了这个解码函数,供大家参考。

 

//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);}    


 

         就不解释了。