无法从 .txt 文件中读取西里尔字符

Can't read cyrillic from .txt file

我想从 .txt 文件中读取这段西里尔文本:аааааааааааа

std::wstring str;
std::wifstream in(path);
std::getline(in, str);
in.close();

但是 str 的内容是:аааааааааааа(文件编码 - UTF-8)(在调试中查看的字符串内容,而不是在控制台中)

我尝试将文件编码更改为 UTF-16(LE 和 BE),有:ÿþ000000000000þÿ000000000000

此外,我找到了 this solution,但如您所见,它没有帮助。

在Windows中您必须以二进制方式打开文件,然后应用UTF16 facet,否则系统将采用默认代码页。请参阅下面的示例。

请注意,使用 UTF8 存储数据很常见,即使在 Windows 应用程序中也是如此。您的 Windows 程序要求 API 使用 UTF16,因此您可以 read/write UTF8 格式的文件,然后来回转换为 UTF16

#define _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING
//silence codecvt warnings

std::wstring str;
std::wifstream in(path, std::ios::binary);
in.imbue(std::locale(in.getloc(), 
    new std::codecvt_utf16<wchar_t, 0x10ffff, std::little_endian>));
std::getline(in, str);
in.close();

您还可以使用 pubsetbuf 来避免 codecvt 警告:

std::wifstream in(path, std::ios::binary);
wchar_t wbuf[128] = { 0 };
in.rdbuf()->pubsetbuf(wbuf, 128);

//BOM check
wchar_t bom{};
in.read(&bom, 1);
if(bom == 0xfeff)
    std::cout << "UTF16-LE\n";

//read file
std::wstring str;
std::getline(in, str);
in.close();