无法从 .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();
我想从 .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();