c++ - UCS-2LE 文本文件解析

标签 c++ unicode wstring ucs2

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

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

如何将 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 (或其他东西)从文件中读取这些字符串并将它们转换为固定宽度表示供内部使用的示例?

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

谢谢!

最佳答案

我花了好几个小时来解决这个问题,以下是我的结论:

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

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

关于c++ - UCS-2LE 文本文件解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1249673/

相关文章:

C++ 将字符串(或 char*)转换为 wstring(或 wchar_t*)

c++ - WString 实现 - 返回以 null 结尾,我走的路是否正确?

c++ - 在编译时通过 constexpr 或模板函数获取多维 std::array 的大小

c++ - 在哪种情况下 if(a=b) 是个好主意?

c++ - 如何将链表的节点直接链接到节点指针?

git 不显示 unicode 文件名

unicode - F# - 卡片套装未显示在控制台中

java - Apache Poi - 将外文字符写入 Excel 97/2003(即中文、日文等)

c++ - 不区分大小写的 std::string.find()

c++ - 在析构函数后打开一个新的 QMainWindow 崩溃