读书人

如何读一个UCS-2 Little Endian的文件

发布时间: 2012-09-03 09:48:39 作者: rapoo

怎么读一个UCS-2 Little Endian的文件
用getline(ifstream, string); 读入string
如果文件中写的是#include <iostream>
string中表示为 乱码 ? i n c l u d e ... 这样带空格的情况
请问各位大神应该用什么东西才能把文件中的信息正确读出来
_| ̄|○

[解决办法]
UCS-2的话,每个字符使用2个byte来存储
所以如果楼主用UltraEdit这类软件打开文件查看文件的16进制数据的话,就可以清楚看到了
比如,“你”的话是 0x604f
“i”的话是 0x6900
“n”的话是 0x6E00
(小端存储,高位数据放在低位地址,本人用的UTF-16-LE看的)
可以看到,存储字母的话只用了1个byte,另一个byte是0x00。
所以include连起来的话就是 0x69006E0063006C00750064006500

而楼主用的string可能还是按照一个byte存储一个字符的方式来读取的
所以就把中间的00认成了空格 0x69空格6E空格63空格6C空格75空格64空格65空格
至于第一位乱码,可能是文件编码的文件头
举例来说,UTF-16-LE的文件头位0xFFFE,这个读进string肯定就是乱码了

建议楼主使用wchar_t* 来存储,wchar_t为宽字符,用2个byte来存储一个字符,用这个存储的话,系统就会认为0x6900是1个字符而不是2个字符了
或者用转化函数将string转成unicode编码的


个人愚见,若有错误,请大神指出。希望能帮到楼主。
[解决办法]
摒弃fstream,string,wstring
使用FILE *,char [],wchar_t []

读书人网 >C++

热点推荐