读书人

一段utf-8转ansi代码的迷惑

发布时间: 2012-11-03 10:57:43 作者: rapoo

一段utf-8转ansi代码的疑惑
转换函数:

C/C++ code
CString Convert(CString str, int sourceCodepage, int targetCodepage){    int len=str.GetLength();        int unicodeLen=MultiByteToWideChar(sourceCodepage,0,str,-1,NULL,0);        wchar_t *pUnicode;     pUnicode=new wchar_t[unicodeLen+1];        memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));        MultiByteToWideChar(sourceCodepage,0,str,-1,(LPWSTR)pUnicode,unicodeLen);        BYTE *pTargetData;    int targetLen=WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char *)pTargetData,0,NULL,NULL);        pTargetData=new BYTE[targetLen+1];    memset(pTargetData,0,targetLen+1);        WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char *)pTargetData,targetLen,NULL,NULL);        CString rt;    rt.Format("%s",pTargetData);    delete pUnicode;    delete pTargetData;    return rt;}


调用:
C/C++ code
void CTestFileDlg::OnCodeConvert() {    CStdioFile inFile, outFile;    if(!inFile.Open("utf.txt",CFile::modeRead|CFile::typeText))    {        AfxMessageBox("无法打开指定文件!");        return;    }    if(!outFile.Open("gb.txt", CFile::modeCreate | CFile::modeWrite)) {        AfxMessageBox("无法打开输出文件!");        return;    }    CString tmp, result;    while(inFile.ReadString(tmp)) {        ConvUtf8ToAnsi(tmp, result);        outFile.WriteString(result+"\n");    }    inFile.Close(); outFile.Close();    AfxMessageBox("done!");}


问题:
输入的文本:8月18日消息,2009百度技术创新大会将于今日10点在中国大饭店正式召开。多名中国顶级互联网技术专家、投资人士和互联网爱好者将共同探讨互联网技术发展趋势,分享相关领域前沿的技术和创新经验。 以下是下午进行的搜索营销分论坛的实录。
组织主席杰夫?普鲁特
输出的文本:?8月18日消息,2009百度技术创新大会将于今日10点在中国大饭店正式召开。多名中国顶级互联网技术专家、投资人士和互联网爱好者将共同探讨互联网技术发展趋势,分享相关领域前沿的技术和创新经验。 以下是下午进行的搜索营销分论坛的实录。
组织主席杰夫?普鲁特
差别:(1)第一行输出文本的第一个字符多了一个?号。
(2)第二行的?变成了?

请帮忙解决这个问题。

[解决办法]
第一个的?应该是文件头EF BB BF,在文本文件中用文件头指明当前文本的编码,这个只能手工去掉。也就是读出来后,判断前三个字节是否是EF BB BF,如果是则直接忽略此三个字节。另外还有一种老式的UTF-8文本,头部没有EF BB BF,记事本会跟据UTF-8编码的特性,将其与Ascii码区分出来。不过Ascii的“联通”两字很不幸的满足了UTF-8的特性,被认错编码显示成了所谓的“烧焦电池”。
第二个·是硬伤,WideCharToMultiByte并不认为unicode的'·'和GBK的'·'是同一个字符,转换不了,也只能手工处理。


[解决办法]
检查一下,去掉BOM头。

读书人网 >VC/MFC

热点推荐