【问题标题】:Reading Unicode files line by line C++逐行读取 Unicode 文件 C++
【发布时间】:2010-06-07 02:54:28
【问题描述】:

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

我做错了什么? 必须阅读文本文件似乎不对 以二进制模式逐字节解析新行。

【问题讨论】:

    标签: c++ unicode


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-06-21
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 2022-01-25
      相关资源
      最近更新 更多