如何将(文本)文件从UTF-8 / ASCII转换为UTF-16,然后才能在MFC程序中显示?因为MFC每个字符使用16位,并且Windows上的大多数(文本)文件使用UTF-8或ASCII。
简单的答案称为MultiByteToWideChar和WideCharToMultiByte进行反向转换。还有CW2A和CA2W使用起来更简单。
但是,我强烈建议不要直接使用这些功能。您有手动处理字符缓冲区的麻烦,并且存在创建内存损坏或安全漏洞的风险。
最好使用基于std :: string和/或迭代器的库。例如,utf8cpp。这具有体积小,仅标头和多平台的优势。
实际上,您可以使用CStdioFile
提供的CString
和MFC
类非常简单。 MFC
库是一个非常强大且全面的库(尽管存在一些主要的怪异之处,甚至存在错误);但是,如果您已经在使用它,那么请充分利用它:
...
const wchar_t* inpPath = L"<path>\\InpFile.txt"; // These values are given just...
const wchar_t* outPath = L"<path>\\outFile.txt"; // ... for illustrative purposes!
CStdioFile inpFile(inpPath, CFile::modeRead | CFile::typeText);
CStdioFile outFile(outPath, CFile::modeWrite | CFile::modeCreate | CFile::typeText
| CFile::typeUnicode); // Note the Unicode flag - will create UTF-16LE file!
CString textBuff;
while (inpFile.ReadString(textBuff)) {
outFile.WriteString(textBuff);
outFile.WriteString(L"\n");
}
inpFile.Close();
outFile.Close();
...
当然,如果您希望输入和输出文件具有相同的路径,则需要稍微更改一下代码,但这并不意味着更改基本前提!
[使用这种方法,不需要任何库调用来转换字符串-当MFC
在读写它的(Unicode)CString
对象时,就让它为您完成!
注意:已在Unicode模式下使用64位MSVC(VS-2019)进行编译和测试。
编辑:也许我误解了你的问题!如果您不想实际转换文件,而只是显示内容,则删除代码中对outFile
的所有引用,并对读取的每个textBuffer
对象进行处理。 CString
类负责所有必需的ASCII / UTF-8 / UTF-16LE转换。