黑马程序员技术交流社区

标题: 大家说说:"联通"的问题 [打印本页]

作者: 李建雄    时间: 2011-10-29 00:51
标题: 大家说说:"联通"的问题
看过视频的兄弟,回答一下这个问题:
新建一个文本文件,输入 联通  保存,关闭,再打开为什么 联通 没有了
作者: olkldksl    时间: 2011-10-29 11:15
记事本默认是以ANSI存储的
而记事本打开时是Windows猜测文件二进制编码是什么编码格式,刚好“联”在UTF-8的范围内 所以就以UTF-8格式打开了
只要你保存时把编码从ANSI改为UTF-8就正常了。
作者: 白倩    时间: 2011-10-29 12:02
字符编码格式不同,记事本打开时将"联"猜测成UTF-8的编码,所以转换时就变成了乱码,你修改一下字符编码就可以了!
作者: 绿影    时间: 2011-10-31 18:47
在记事本文件中输入“联通”两个字符或者”a联通”,保存,再次打开时确实乱码。原因就在于“联通”两个字符的GBK(中文系统默认字符编码)二进制格式偶然性的完全编码符合UTF-8的编码规范,在保存后,记事本再次打开检测时认为这是UTF-8字符,解码时自动调用UTF-8进行解码,导致乱码。如果在前面多写几个中文就不会出现这种情况。因为记事本根据前面的字符集判断是GBK的编码。
作者: 杨小鹏    时间: 2011-10-31 20:40
    这里涉及到不同编码表的问题,具体来说就是GBK和UTF-8这两个编码表间转换的问题。
    通常我们认为一个中文由两个字节组成,这是在GBK编码表。而UTF-8编码表中一个文字由3个字节组成。那么在读取汉字的时候,计算机读到的是我们保存汉字时被计算机转换的二进制数据。/*计算机在保存汉字的时候,会先将汉字转换成二进制保存。windows以GBK为基本汉字编码。*/然后通过编码表转化成汉字。问题就出现在这。
    我们先看看两个编码表的读取方式。
    GBK编码表是以一定的规则每读取两字节的数据就返回一个汉字,它的规律我们先不看。但我们的计算机中既然存在着多个编码表,那么各个编码表间读取数据的方法就会有一定的区分。
    UTF-8编码表中一个汉字由1-3个字节组成,有可能是由一个字节单独表示汉字,也有可能是2个字节表示一个汉字,3个字节也能表示汉字。所以这里面就有区分的方法,UTF-8是通过对二进制数据定义标识头信息来实现的。而这个定义的标识头信息就是产生这个联通问题的原因。
    UTF-8的规则如下:
        有这样的数据    0101-0100 1101-1010 1001-0100 1110-1110 1001-1010 1001-0100
    当二进制数是0开始的时候,这一个字节就表示一个汉字,读到0开头的数据,那么UTF-8就会将这个 0101-0100 当成一个汉字转换成汉字,而不管后面的字节是什么。
    当二进制数是110开始而后一个数是以10开始的时候,表示这个字节和下一个字节一起表示一个汉字。如读完 0101-0100后,读到了110开头的数据并且下一个字节是以10开头,那么UTF-8就会将这个字节和下一个字节 1101-1010 1001-0100 一起转换成汉字。
    当二进制数是1110开始并且下面两个字节都是以10开头的时候,表示这个字节和下两个字节一起表示一个汉字。。如读完 1101-1010 1001-0100 后,读到了110开头的数据,并且下面两个字节都是以10开头。那么UTF-8就会将这个字节和下两个字节 1110-1110 1001-1010 1001-0100 看成一组转换成汉字。
    好,下面进入正题。
    通过查GBK的编码表我们可以发现,"联通"这两个字的GBK编码为:
    联-->1100-0001 1010-1010
       通-->1100-1101 1010-1000
    这就是‘联通’特殊的地方,它们的GBK编码同样符合UTF-8的规则。保存联通开头的记事本时,以GBK的编码方法对‘联通’编码,当打开记事本对它解码时,直接就查了UTF-8的编码表,而UTF-8表中又没有这个数据,那么就出现了乱码。避免的方法就是在这两汉字的前面一定要有一个汉字出现。
作者: 史晓霞    时间: 2011-11-2 12:58
汉字有两种最常用的编码方式是gbk和utf-8,联通生成的二进制符合了utf-8的取标记的规则,记事本会按utf-8的编码方式打开,就出现了乱码,在前面写个汉字,就可以正常打开了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2