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 西里尔文文本的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 控制台中编写西里尔文文本

从 SQLite 数据库中读取非 Unicode、非英文文本

React 组件中的 JSX 将西里尔文文本显示为 habra-codabra

C++ 读取 UTF-8 及 GBK 系列的文本方法及原理

如何防止在 Docker 容器中运行的 bash 中扭曲西里尔文文本?

从文本文件中读取变量