`

分析记事本写联通两字出现乱码的原因

阅读更多

现象:

当你在 windows 的记事本里新建一个文件,输入"联通"两个字之后,保存,关闭,然后再次打开,你会发现这两个字已经消失了,代之的是几个乱码!

 

分析:

这时我们看看utf8的编码格式:

    UCS-2编码(16进制) UTF-8 字节流(二进制) 
    0000 - 007F 0xxxxxxx 
    0080 - 07FF 110xxxxx 10xxxxxx 
    0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
 

 

在保存这个操作中,windows默认保存的编码是ANSI(实际上应该是GBK)。

这样联通这两个字的二进制内码是:(一个字占两个字节)

c1    1100 0001
aa   1010 1010
cd   1100 1101
a8   1010 1000

 

巧合的地方在于联通这两个字的ANSI编码符合utf8编码的第二个模板。

 

第一二个字节、第三四个字节的起始部分的都是"110"和"10",正好与UTF8规则里的两字节模板是一致的,于是再次打开记事本时,记事本就误认为这是一个UTF8编码的文件,让我们把第一个字节的110和第二个字节的10去掉,我们就得到了"00001 101010",再把各位对齐,补上前导的0,就得到了"0000 0000 0110 1010",不好意思,这是UNICODE的006A,也就是小写的字母"j",而之后的两字节用UTF8解码之后是0368,这个字符什么也不是。这就是只有"联通"两个字的文件没有办法在记事本里正常显示的原因。

 

可以认为,当文档中的所有字符的二进制编码在C0≤AA(第一个字节)≤DF  80≤BB(第二个字节)≤BF时,记事本都无法确认文本的编码格式,就按照UTF-8的格式来显示。

 

另外,当我们在记事本编写"联通",然后另存为,选择UTF-8的格式,保存。再重新打开的时候,就不会有乱码。用UltraEdit的十六进制打开可以看到 EF BB BF E8 81 94 E9 80 9A。其中 EF BB BF 是UTF-8编码格式的标记。当用记事本打开文件时,读到EF BB BF 时,就确定这是UTF-8编码格式的字符。所以打开时不会看到乱码。同理与Unicode、UTF-16。

Unicode的"联通"的十六进制编码:FF FE 54 80 1A 90 。其中FF FE 是Unicode的标记

UTF-16的"联通"的十六进制编码为:FE FF 80 54 90 1A。这里的FE FF是UTF-16的标记

 

这里提一下MBCS ,Multi-Byte Chactacter System,多字节字符系统,通常也称为ANSI字符集。

MBCS文本没有这些开头的字符集标记。更不幸的是,一些早期的和一些设计不良的软件在保存Unicode文本时不插入这些位于开头的字符集标记。因此,软件不能依赖于这种途径。这时,软件可以采取一种比较安全的方式来决定字符集及其编码,那就是弹出一个对话框来请示用户,例如将那个“连通”文件拖到MS Word中,Word就会弹出一个对话框。

如果软件不想麻烦用户,或者它不方便向用户请示,那它只能采取自己“猜”的方法,软件可以根据整个文本的特征来猜测它可能属于哪个charset,这就很可能不准了。使用记事本打开那个“连通”文件就属于这种情况。

 

 参考于:http://www.360doc.com/content/05/1231/13/2778_52114.shtml

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics