我有一个文本文件,它是使用某些 Microsoft 报告工具创建的。文本文件在开头包含 BOM
0xFFFE
,然后是 ASCII
字符输出,字符之间有空值(即“F.i.e.l.d.1.
”)。我可以使用 iconv
将其转换为 UTF-8
使用 UCS-2LE
作为输入格式和 UTF-8
作为一种输出格式……效果很好。
我的问题是我想将 UCS-2LE
文件中的行读入字符串并解析字段值,然后将它们写入 ASCII
文本文件(即 Field1 Field2
)。我已经尝试了基于 string
和 wstring
的 getline
版本——当它从文件中读取字符串时,功能类似于 substr( start, length)
将字符串解释为 8 位
值,因此开始和长度值是关闭的。
如何将 UCS-2LE
数据读入 C++
字符串并提取数据值?我查看了 boost
和 icu
以及大量的谷歌搜索,但没有找到任何有效的方法。我在这里错过了什么?请帮忙!
我的示例代码如下所示:
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
可能不理解宽字符串吗?
谢谢!
最佳答案
我花了好几个小时来解决这个问题,以下是我的结论:
读取
UTF-16
(或UCS2-LE
)文件显然可以在 C++11 中管理,参见 How do I write a UTF-8 encoded string to a file in Windows, in C++由于
boost::locale
库现在是 C++11 的一部分,因此可以只使用codecvt_utf16
(最终代码示例请参见下面的项目符号)但是,在较旧的编译器(例如 MSVC 2008)中,您可以使用
locale
和自定义codecvt
facet/“recipe”,如在this answer至 Writing UTF16 to file in binary mode或者,也可以试试 this method阅读,尽管它对我不起作用。输出将丢失由垃圾字符替换的行。
我无法在我的 C++11 之前的编译器中完成这项工作,不得不求助于用 Ruby 编写脚本并生成一个进程(它只是在测试中,所以我认为这种复杂性是可以接受的)执行我的任务。
希望这可以节省其他人一些时间,很乐意提供帮助。
关于c++ - UCS-2LE 文本文件解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1249673/