碰到一个比较奇怪的情况,在同一系统下(Vista SP2),同一个文件,用UE打开是乱码(¿ªʼʱ¼⋊),而用记事本打开正常(开始时间),这是一种什么情况?
分析:
我们假设在两种方式打开前,文件的编码是一致的,而种种迹象表明测试机上UE是用utf-8来解码的(可以测试证明,用记事本打开该文件,另存为utf-8,再用UE将另存后文件打开,显示正常,不再是乱码),记事本是用什么解码尚不明确,
"¿ªʼʱ¼⋊ "的utf-8编码是:
[-62, -65, -62, -86, -54, -68, -54, -79, -62, -68, -30, -117, -118]
转换成16进制表示:
C2 BF C2 AA CA BC CA B1 C2 BC E2 8B 8A
但是这编码和"开始时间 "又有什么联系呢?
再看"开始时间 "的gbk编码:
[-65, -86, -54, -68, -54, -79, -68, -28]
转换成16进制表示:
BF AA CA BC CA B1 BC E4
看似有一定联系,但一下又找不到明确的关联~可能是编码有问题~
基本确定原因是UE中有一个配置项是自动检测UTF-8文件,如果被UE判断为该文件是UTF-8,那么该文件中包含的汉字即使不是以UTF-8编码的,也为被强制以UTF-8解码,并对原码进行UTF-8泛化处理,如本文上面编码的变化,以上是我自己的分析,基本可验证所有现象,附一篇参考文档:
http://www.cnblogs.com/zebbey/archive/2009/12/02/1615238.html
UltraEdit是个功能很强大的文本编辑器,我日常的程序开发工作基本上都用它就完成了。
但是,最近几天我时不时的会发现我用UltraEdit保存某些带有中文注释的代码文件,结果出现了乱码,感觉异常奇怪。今天花了点时间总算是把问题搞清楚。
首先,UltraEdit的系统设置里有一项为“自动检测UTF-8文件”,如果这个项目设置了,那么UltraEdit会按照一定的规则去检测UTF-8文件。
这个规则包含unicode中关于BOM的相关标准,这部分这里我就不说了,另外UltraEdit还支持一个很诡异的规则,就是如果文本中包 含:encoding="utf-8"这样的字符串,那么,UltraEdit就会认为这个文件是utf-8编码的。可以这样做一个实验,用 windows自带的记事本(notepad)创建一个文本文件,在里面输入点中文,然后写上:encoding="utf-8",保存为ANSI编码 的,然后将UltraEdit的“自动检测UTF-8文件”打开,打开刚才用notepad保存的文件,可以发现,这时显示的是乱码。这里 UltraEdit把这个文件当作是utf-8编码的了。
这个规则可能在某些情况下让使用者很尴尬。因为这样的特殊文字并不那么特殊,比如XML文件,python代码文件。我放弃使用UltraEdit了,改用EmEditor。
总结下来呢就是GBK编码的汉字被UE当作UTF-8泛化解码处理了!