繁体   English   中英

MFC 中的 C++ UTF-8/ASCII 到 UTF-16

[英]C++ UTF-8/ASCII to UTF-16 in MFC

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

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

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

使用基于 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();
...

当然,如果您希望输入和 output 文件具有相同的路径,则需要更改代码(一点),但这并不意味着更改基本前提!

使用这种方法,无需担心任何库调用来转换字符串 - 只需让MFC为您完成,当它读取/写入它的(Unicode) CString对象时!

注意:在 Unicode 模式下使用 64 位 MSVC (VS-2019) 编译和测试。

编辑:也许我误解了你的问题,如果你不想实际转换文件,而只是显示内容,然后将我的代码中的所有引用移到outFile并只对你阅读的每个textBuffer做一些事情。 CString class 负责所有必需的 ASCII/UTF-8/UTF-16LE 转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM