【问题标题】:UCS-2LE text file parsingUCS-2LE 文本文件解析
【发布时间】:2010-11-17 23:49:00
【问题描述】:

我有一个使用 Microsoft 报告工具创建的文本文件。文本文件在开头包含BOM0xFFFE,然后是ASCII 字符输出,字符之间有空值(即“F.i.e.l.d.1.”)。我可以使用iconv 将其转换为UTF-8,使用UCS-2LE 作为输入格式,UTF-8 作为输出格式...效果很好。

我的问题是我想将UCS-2LE 文件中的行读入字符串并解析出字段值,然后将它们写入ASCII 文本文件(即Field1 Field2)。我已经尝试过基于stringwstringgetline 版本——当它从文件中读取字符串时,substr(start, length) 之类的函数会将字符串解释为8-bit 值,因此起始值和长度值是关闭。

如何将UCS-2LE 数据读入C++ 字符串并提取数据值?我查看了boosticu 以及大量的谷歌搜索,但没有找到任何有效的方法。我在这里想念什么?请帮忙!

我的示例代码如下所示:

wifstream srcFile;
srcFile.open(argv[1], ios_base::in | ios_base::binary);
..
..
wstring  srcBuf;
..
..
while( getline(srcFile, srcBuf) )
{
    wstring field1;
    field1 = srcBuf.substr(12, 12);
    ...
    ...
}

因此,例如,如果srcBuf 包含“W.e. t.h.i.n.k. i.n. g.e.n.e.r.a.l.i.t.i.e.s.”,那么上面的substr() 返回“.k. i.n. g.e”而不是“g.e.n.e.r.a.l.i.t.i.e.s.”。

我想要的是读取字符串并对其进行处理,而不必担心多字节表示。有没有人有使用boost(或其他东西)从文件中读取这些字符串并将它们转换为固定宽度表示以供内部使用的示例?

顺便说一句,我在使用 Eclipse 和 gcc 的 Mac 上。我的 STL 可能不理解宽字符串吗?

谢谢!

【问题讨论】:

    标签: c++ unicode wstring ucs2


    【解决方案1】:

    花了一些时间解决这个问题,以下是我的结论:

    • 在 C++11 中读取UTF-16(或UCS2-LE)文件显然是可管理的,请参阅How do I write a UTF-8 encoded string to a file in Windows, in C++

    • 由于 boost::locale 库现在是 C++11 的一部分,因此可以只使用 codecvt_utf16(有关最终代码示例,请参见下面的项目符号)

    • 1234563 >
    • 或者,也可以尝试阅读this method,尽管在我的情况下它不起作用。输出将丢失被垃圾字符替换的行。

    我无法在我的 C++11 之前的编译器中完成这项工作,不得不求助于在 Ruby 中编写脚本并生成一个进程(它只是在测试中,所以我认为这种复杂性是可以的)执行我的任务。

    希望这可以节省其他人一些时间,很乐意提供帮助。

    【讨论】:

      【解决方案2】:

      substr 在带有 g++ 4.3.3 的 Linux 上对我来说很好用。程序

      #include <string>
      #include <iostream>
      
      using namespace std;
      
      int main()
      {
        wstring s1 = L"Hello, world";
        wstring s2 = s1.substr(3,5);
        wcout << s2 << endl;
      }
      

      按应有的方式打印“lo, w”。

      但是,文件读取的结果可能与您的预期不同。它将文件从语言环境编码转换为 wchar_t,这将导致每个字节成为自己的 wchar_t。我认为标准库不支持将 UTF-16 读入 wchar_t。

      【讨论】:

      • 感谢您的回复。我看到了同样的行为。正如您所说,我认为不支持 UTF-16 到 wchar_t。我使用 iconv 将文件转换为 UFT-8 并解决了问题。
      • 虽然我可能在这里解决鬼,@Cryptik 应该将他的问题标记为已解决:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 2012-10-09
      • 2015-01-07
      相关资源
      最近更新 更多