逐行读取Unicode文件

时间:2010-06-07 02:54:29

标签: 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,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。

我做错了什么? 人们应该阅读文本文件似乎是不对的 在二进制模式下逐字节地解析新行。

1 个答案:

答案 0 :(得分:5)

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

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