逐行读取Unicode文件

Rog*_*son 1 c++ unicode

在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.

我究竟做错了什么?为了解析新行,人们不得不在二进制模式下逐字节读取文本文件.

Bil*_*eal 5

std::wifstream将宽字符集暴露给您的程序,通常是Windows上的UCS-2和Unix上的UTF-32,但假设输入文件仍然使用窄字符.如果您希望它在磁盘上使用宽字符,则需要使用std::codecvt<wchar_t, wchar_t>构面.

你应该能够找到你的编译器的实现,std::codecvt<char, char>它也是一个非转换代码转换方面,并将chars更改为wchar_ts.