在C++中逐行读取Unicode文件的正确方法是什么?
我试图通过Windows记事本读取保存为Unicode(LE)的文件.
假设文件在单独的行中仅包含字符A和B.
在逐字节读取文件时,我看到以下字节序列(十六进制):
FE FF 41 00 0D 00 0A 00 42 00 0D 00 0A 00
所以2字节BOM,2字节 'A',2字节CR,LF 2字节,2字节 'B',2字节CR,2字节LF.
我尝试使用以下代码读取文本文件:
std::wifstream file("test.txt");
file.seekg(2); // skip BOM
std::wstring A_line;
std::wstring B_line;
getline(file,A_line); // I get "A"
getline(file,B_line); // I get "\0B"
Run Code Online (Sandbox Code Playgroud)
我使用>> operator而不是getline获得相同的结果
file >> A_line;
file >> B_line;
Run Code Online (Sandbox Code Playgroud)
似乎单字节CR字符仅作为单字节消耗.或CR NULL LF正在消耗但不是高字节NULL.我希望文本模式中的wifstream会读取2byte CR和2byte LF.
我究竟做错了什么?为了解析新行,人们不得不在二进制模式下逐字节读取文本文件.
std::wifstream将宽字符集暴露给您的程序,通常是Windows上的UCS-2和Unix上的UTF-32,但假设输入文件仍然使用窄字符.如果您希望它在磁盘上使用宽字符,则需要使用std::codecvt<wchar_t, wchar_t>构面.
你应该能够找到你的编译器的实现,std::codecvt<char, char>它也是一个非转换代码转换方面,并将chars更改为wchar_ts.