使用Unicode字符集时用CFile把中文写入txt文件再用记事本打开出现乱码的问题

使用Unicode字符集时用CFile把中文写入txt文件再用记事本打开出现乱码的问题  


新建一个记事本,写入“中”,另存为ANSI.txt,编码选ANSI;再次另存为Unicode.txt,编码选Unicode。把这两个文件用UltraEdit的十六进制功能打开(编辑 -> 十六进制功能 -> 十六进制编辑),如下图所示:



打开VS(我用的是VS2005),设定字符集为Unicode(右键项目名,属性 -> 配置属性 -> 常规 -> 字符集 -> 使用 Unicode 字符集),然后使用下面这段代码生成一个文件




CString strPath = _T("C:\\Documents and Settings\\Administrator\\桌面\\test.txt");
  CFile file;  
if (file.Open(strPath, CFile::modeCreate | CFile::modeWrite)) 
 {     
      //file.Write("\xff\xfe", 2); // 设置Unicode编码文件头   
       CString strText = _T("中");   
      file.Write(strText, sizeof(TCHAR) * strText.GetLength()); 
 }


把生成的文件用记事本打开,出现乱码,同样用十六进制功能打开,结果如下图所示:





对比图2发现最后两个字节都一样,但是图2前面多了两个字节:FF FE


一阵google之后发现图2中最开头的这两个字节是用于说明文件的编码方式,本例中我们把Unicode字符写入文件,却没有设置这个文件头。于是用记事本打开时,系统就会认为这是一个ANSI编码的文件(见图1,ANSI编码的文件没有文件头,没找到文件头就认为是ANSI编码),当然就出现乱码了。


解决办法:思路当然就是要想办法写入文件开头的那两个字节,这样系统才会认定这是一个Unicode编码的文件。具体方法就是把上面那段代码中的注释去掉,重新生成一下文件,用十六进制功能打开,发现和图2一样了,再用记事本打开,可以正常显示了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值