一段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头。