使用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一样了,再用记事本打开,可以正常显示了。
新建一个记事本,写入“中”,另存为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一样了,再用记事本打开,可以正常显示了。