在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,2字节LF,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"
使用>>我得到相同的结果运算符而不是getline
file >> A_line;
file >> B_line;
单字节CR字符似乎是 仅作为单个字节消耗。 或CR NULL LF正在消耗但不是高字节NULL。 我希望文本模式下的wifstream会读取2byte CR和2byte LF。
我做错了什么? 人们应该阅读文本文件似乎是不对的 在二进制模式下逐字节地解析新行。
答案 0 :(得分:5)
std::wifstream
公开了程序的宽字符集,通常是Windows上的UCS-2和Unix上的UTF-32,但假设输入文件仍然使用窄字符。如果您希望它在磁盘上使用宽字符,则需要使用std::codecvt<wchar_t, wchar_t>
方面。
您应该能够找到编译器的std::codecvt<char, char>
实现,这也是一个非转换代码转换方面,并将字符更改为wchar_ts。