写入UTF-16文件的时候,不要忘记在文件头添加BOM

windows下的Unicode是UTF-16,每个字都用两个字节来表示。编程的时候,通过TEXT宏,以及在项目中定义Unicode, _Unicode变量,就可以保证整个项目都是在Unicode下工作。

 

现在在将字符串写入文件的时候,发生了一些问题。写文件用的是WriteFile函数,字符串本身都是UTF-16的,写入文件后发现用vim和记事本打开都无法正确显示。用16进制的方式查看,每个字都是对的,都是2个字节,如果是英文字母,第二个字节就是00。

 

google了一下,发现了答案。要在文件开头写入0xfffe,这是Unicode file的identifier,windows下的记事本和写字板读到这个头之后,就能正确识别这是一个Unicode文件了。所以,在代码中,创建文本文件的时候,要多写这样一段:
//  logfile doesn't exist, create it, that's all
hFile  =  CreateFile(log_file_path, GENERIC_WRITE, NULL, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
if  (hFile  ==  INVALID_HANDLE_VALUE) {
    operate_result 
=  FALSE;
else  {
    
//  write 0xfffe at the beginning of the file, this makes Notepad reads Unicodes well
    WORD unicode_identifier  =   0xfeff ;
    
if  (WriteFile(hFile,  & unicode_identifier,  sizeof (WORD),  & bytes_written, NULL)) {
        operate_result 
=  TRUE;
    } 
else  {
        operate_result 
=  FALSE;
    }
}
goto  finished;

finished:
    
if  (hFile  !=  NULL  &&  hFile  !=  INVALID_HANDLE_VALUE)
        CloseHandle(hFile);
    
return  operate_result;

 

 

这里不要奇怪为什么设置给unicode_identifier变量的值是0xfeff,这是因为x86是little endian,所以代码中的oxfeff存在寄存器中,然后设置到内存的时候,从低地址到高地址就变成了fffe,这样最后将这个WORD写入文件之后就正好是fffe了。

 

最后我自己又测试了一下,写入中文也是没有问题的。使用gvim来打开的话需要设置一下,我在Ubuntu下打开文件是OK的,windows下的gvim的.vimrc设置和Ubuntu一样的话,应该也是没问题的。 

转载于:https://www.cnblogs.com/super119/archive/2010/12/29/1920908.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值