[C ++ UTF-8 / ASCII在MFC中为UTF-16

问题描述 投票:0回答:2

如何将(文本)文件从UTF-8 / ASCII转换为UTF-16,然后才能在MFC程序中显示?因为MFC每个字符使用16位,并且Windows上的大多数(文本)文件使用UTF-8或ASCII。

c++ utf-8 mfc ascii utf-16
2个回答
2
投票

简单的答案称为MultiByteToWideCharWideCharToMultiByte进行反向转换。还有CW2ACA2W使用起来更简单。

但是,我强烈建议不要直接使用这些功能。您有手动处理字符缓冲区的麻烦,并且存在创建内存损坏或安全漏洞的风险。

最好使用基于std :: string和/或迭代器的库。例如,utf8cpp。这具有体积小,仅标头和多平台的优势。


2
投票

实际上,您可以使用CStdioFile提供的CStringMFC类非常简单。 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转换。

© www.soinside.com 2019 - 2024. All rights reserved.