【问题标题】:C++ UTF-8/ASCII to UTF-16 in MFCMFC 中的 C++ UTF-8/ASCII 到 UTF-16
【发布时间】:2020-01-29 01:01:11
【问题描述】:

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

【问题讨论】:

标签: c++ utf-8 mfc ascii utf-16


【解决方案1】:

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

但是,我强烈建议不要直接使用这些函数。手动处理字符缓冲区很痛苦,有造成内存损坏或安全漏洞的风险。

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

【讨论】:

  • 您可以推荐其他库以实现可移植性,但没有理由不推荐使用您列出的简单 API。此外,ATL/MFC 已经提供了CA2WCW2A 用于Unicode 转换。您不妨使用 ATL/MFC 方法,因为可移植性在 MFC 程序中通常毫无意义。
  • 我提到了CW2A/CA2W,我不知道它存在。还添加了指向 MSDN 的链接,并解释了为什么最好使用库,正如您所建议的那样。
  • 我冒昧地建议我的答案实际上更简单!
【解决方案2】:

其实你可以很简单地做到这一点,使用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 模式下使用 64 位 MSVC (VS-2019) 编译和测试。

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

【讨论】:

    猜你喜欢
    • 2012-08-18
    • 2021-01-06
    • 2011-12-13
    • 1970-01-01
    • 2021-01-30
    • 2011-01-11
    • 2012-10-08
    • 1970-01-01
    • 2016-05-31
    相关资源
    最近更新 更多