C++ 无法从文件中读取 UTF-8 西里尔文文本
Posted
技术标签:
【中文标题】C++ 无法从文件中读取 UTF-8 西里尔文文本【英文标题】:C++ Can't read UTF-8 cyrillic text from file 【发布时间】:2017-02-08 11:53:14 【问题描述】:文件采用 UTF-8 (65001) 编码。我无法从中读取西里尔符号。
CString FNAME;
CStdiofile fNFR;
fNFR.Open(_T("LFS200.25"), CFile::modeRead);
fNFR.ReadString(FNAME);
得到了这个:
Зимний максимум 1989/90 гг.
而不是这个:
Зимний максимум 1989/90 гг.
试过了
setlocale(LC_ALL, "Rus");
还是同样的问题。
如何获取正确的字符串?
【问题讨论】:
这个是 UTF8。 C++ 有 16 位字符 (char16_t) 和字符串,但 UTF8 字符串被视为 char。如果要将 UTF8 字节转换为 UTF16,则需要 codecvt 检查 this question on UTF support in C++ 和 MSDN 中的 String and Character Literals 页面 检查codecvt_utf8_utf16。您应该能够使用std::u16string u16_conv = std::wstring_convert< std::codecvt_utf8_utf16<char16_t>, char16_t>.from_bytes(u8);
将您的 UTF8 字符串转换为 UTF16
【参考方案1】:
我在这里找到了答案(需要将utf-8转为utf-16):
CONVERSION BETWEEN UNICODE UTF-16 AND UTF-8 IN C++/WIN32
【讨论】:
这不是一个好的解决方案。它是在 7 年前编写的,当时 C++ 还没有原生 Unicode 支持。最后,这只是对WideCharToMultiByte
的调用。我 100% 确定作者今天会告诉你“不要这样做!”。
或initialize CStdioFile with a UTF8 FILE stream以上是关于C++ 无法从文件中读取 UTF-8 西里尔文文本的主要内容,如果未能解决你的问题,请参考以下文章
从 SQLite 数据库中读取非 Unicode、非英文文本
React 组件中的 JSX 将西里尔文文本显示为 habra-codabra