UE打开汉字乱码,而记事本打开则非乱码现象分析                :

UltraEdit是个功能很强大的文本编辑器,日常的工作程序开发工作基本上都用它就完成。

最近碰到一个比较奇怪的情况,在同一系统下,同一个文件,用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泛化处理,如本文上面编码的变化。

UltraEdit的系统设置里有一项为“自动检测UTF-8文件”,如果这个项目设置了,那么UltraEdit会按照一定的规则去检测UTF-8文件。
UltraEdit支持一个很诡异的规则,就是如果文本中包含:encoding="utf-8"这样的字符串,那么,UltraEdit就会认为这个文件是utf-8编码的。

可以这样做一个实验,用windows自带的记事本(notepad)创建一个文本文件,在里面输入点中文,然后写上:encoding="utf-8",保存为ANSI编码的,然后将UltraEdit的“自动检测UTF-8文件”打开,打开刚才用notepad保存的文件,可以发现,这时显示的是乱码。这里UltraEdit把这个文件当作是utf-8编码的了。


总结下来呢就是GBK编码的汉字被UE当作UTF-8泛化解码处理了!