【问题标题】:C++ Can't read UTF-8 cyrillic text from fileC++ 无法从文件中读取 UTF-8 西里尔文文本
【发布时间】: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
  • 检查codecvt_utf8_utf16。您应该能够使用 std::u16string u16_conv = std::wstring_convert< std::codecvt_utf8_utf16<char16_t>, char16_t>{}.from_bytes(u8); 将您的 UTF8 字符串转换为 UTF16

标签: c++ visual-studio-2015 utf-8 cyrillic cfile


【解决方案1】:

我在这里找到了答案(需要将utf-8转为utf-16):

CONVERSION BETWEEN UNICODE UTF-16 AND UTF-8 IN C++/WIN32

【讨论】:

  • 不是一个好的解决方案。它是在 7 年前编写的,当时 C++ 还没有原生 Unicode 支持。最后,这只是对WideCharToMultiByte 的调用。我 100% 确定作者今天会告诉你“不要这样做!”。
猜你喜欢
  • 1970-01-01
  • 2012-04-01
  • 2018-04-22
  • 2015-12-04
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多