C++ UTF-8/ASCII to UTF-16 in MFC
C++ UTF-8/ASCII to UTF-16 in MFC
如何在 MFC 程序中显示(文本(文件之前将(文本(文件从 UTF-8/ASCII 转换为 UTF-16? 因为 MFC 每个字符使用 16 位,而 Windows 上的大多数(文本(文件使用 UTF-8 或 ASCII。
简单的答案称为MultiByteToWideChar和WideCharToMultiByte进行反向转换。还有 CW2A 和 CA2W 使用起来更简单一些。
但是,我强烈建议不要直接使用这些函数。手动处理字符缓冲区可能会造成内存损坏或安全漏洞
。最好使用基于 std::string 和/或迭代器的库。例如,utf8cpp。这个的优点是体积小,仅标题和多平台。
实际上,您可以使用MFC
提供的CStdioFile
和CString
类非常简单地执行此操作。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转换。
相关文章:
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 从/到 UTF-8/UTF-16 的转换需要(例如:utf8 -> 代码点,然后代码点到 utf16)或(例如:utf8 -> utf16)?
- 通过分隔符分隔包含 UTF-16 BE 文本的uint8_t数组
- 如何从Little Endian UTF-16编码字节中获取C++std::string
- C++ UTF-8/ASCII to UTF-16 in MFC
- 如何C++ WCOUT UTF-16 编码的字符数组?
- 在这种情况下,UTF-16 和 UTF-32 的 BOM 是强制性的
- 查找十六进制字符串是 utf-8 或 utf-16
- 如何在C 17中读取UTF-16文本文件
- 在 Linux 中将 UTF-32 宽字符转换为 UTF-16 宽字符以获取补充平面字符
- C 14:UTF-8/UTF-16与本机字符编码之间的转换
- UTF-16 流中的 CRLF 错误?
- Windows的unicode数据类型使用什么unicode编码(UTF-8、UTF-16等)
- 可以将 UTF-8/UTF-16 选项传递给从C++调用的 JVM
- UTF 16 到 UTF8,使用 C++ 中的 utf8 库
- 使用标准C++无线流读取UTF-8文本并转换为UTF-16
- 将字节数组从UTF-16转换为UTF-8
- 如何将UTF-16中的字符串转换为C 中的UTF-8
- 在 VS 调试器中显示 UTF-16 字符串
- 为什么我不能在窗口上使用 boost::locale::conv::between 将 UTF-16 文本转换为其他编码