C++ UTF-8/ASCII to UTF-16 in MFC

C++ UTF-8/ASCII to UTF-16 in MFC

本文关键字:UTF-16 in MFC to ASCII UTF-8 C++      更新时间:2023-10-16

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

简单的答案称为MultiByteToWideChar和WideCharToMultiByte进行反向转换。还有 CW2A 和 CA2W 使用起来更简单一些。

但是,我强烈建议不要直接使用这些函数。手动处理字符缓冲区可能会造成内存损坏或安全漏洞

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

实际上,您可以使用MFC提供的CStdioFileCString类非常简单地执行此操作。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 模式下使用 MSVC (VS-2019( 编译和测试,64 位。

编辑:也许我误解了你的问题!如果您不想实际转换文件,而只想显示内容,请删除我的代码中的所有引用以outFile,只需对您读取的每个textBuffer对象执行操作。CString类负责所有必需的ASCII/UTF-8/UTF-16LE转换。