注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

生命无非记忆

不要在记忆中丢失了自己

 
 
 

日志

 
 

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

2011-04-20 14:40:10|  分类: c/c++/MFC |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

为了解决这个问题,先来做个实验:

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

图1:
使用Unicode字符集时用CFile把中文写入txt文件再用记事本打开出现乱码的问题 - zisedeqing - 生命无非记忆

图2:
使用Unicode字符集时用CFile把中文写入txt文件再用记事本打开出现乱码的问题 - zisedeqing - 生命无非记忆

打开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()); 
 }

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

图3:
使用Unicode字符集时用CFile把中文写入txt文件再用记事本打开出现乱码的问题 - zisedeqing - 生命无非记忆

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

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

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

  评论这张
 
阅读(5041)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017