网页编码深入介绍和应用

来源:互联网 发布:尼尔森数据分析报告ppt 编辑:程序博客网 时间:2024/05/10 18:39
1、字符集和字母编码

字符集:各种文字和符号的集合,包括各个国家文字、标点符号、图形符号、数字等。
编码:计算机要准确处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。
字符编码:以二进制数字来对应字符集的字符。

注:在制定标准的时候,字符集和编码一般都是同时制定的,例如GB2312,GBK,JIS等,除了是字符集的意思,本身也有编码的含义;另外Unicode是字符集,它有多种编码方式,例如UTF8、UTF16等。

2、字符编码分类总结

2.1、ASCII编码


0-127号共128个字符,包含了控制字符和输出字符(空格、标点符号、数字、大小写字母)可以用来保存英文文字。
ASCII编码是8-bit(最高位统一为0),每个字符占一个字节。

2.2、 扩展字符集

ASCII码保存其他国家,比如法国德国有注音符,于是最高位也被编了进去。增加了128-255号,共256个字符,于是128-255号就被称为扩展字符集。但是不同国家的扩展字符集解释不同,前128个符号解释是一样的。后128个字符就不统一了。

2.3、 GB2312、GBK、GB18030

轮到汉字的时候,256个字符是完全满足不了的,于是发明了GB2312,用两个8-bit代表绝大多数的汉字。收录了6763个简体汉字,682个符号。适用于简体中文环境,属于中国国家标准。
遇到比较繁琐生僻的文字或者繁体字时,GB2312中没能收录进去,于是把GB2312没有使用的码位使用上了,增加了近20000个新的汉字包括繁体和字符。扩展为GBK。
后来对少数民族语言编码时候,加入了几千个新的少数民族的文字,扩展成了GB18030。
另外GB2312、GBK和GB18030都是双字符编码,中文汉字占两个字节,英文字母占一个字节。双字符编码为什么英文字符是一个字节?这里所说的英文字符通常是指半角字母,GB系列的编码是通过最高位来和ASCII码区别的,所以和ASCII码可以混用,当最高位为0时,也就是半角字母时,用ASCII码方式保存为一个字节。当时全角字母的时候,最高位不为0了,也就一个全角和一个汉字是一样的占用两个字节了。

2.4、 Unicode

针对【2.2】的问题,为了使国际间信息交流方便,国际组织统一制定了Unicode字符集。Unicode字符包括了所有语言,可以容纳100多万个字符,硬性规定所有的字符都扩展为两个字节,也就是说英文也占两个字节了,只不过高八位全是0,这种大气的方法使得编码得到了统一,但又出现了新的问题。与之前的编码不兼容。双字节编码的unicode和单字节ASCII不能相互处理;C语音使用'\0'作为字符串结束,而unicode中恰有很多字符的一个字节为0,这样会出现很多的兼容问题。需要注意的是,unicode只是一个符号集合,它规定了符号的二进制代码,但没有规定这个二进制是如何储存的,对于计算机识别超过一个字节的字符的时候,计算机怎么识别这是一个字符还是每个字节都是一个字符呢。直到UTF出现,互联网的普及,强烈要求出现一种统一的编码方式让计算机识别,utf-8是比较常见的,其他的还有UTF-16和UTF-32。

UTF-8
 

UTF-8不是固定字长编码,而是变长的编码方式,用0-4个字节来表示字符。这样很好的处理了unicode储存英文文本时占用双倍空间的问题。因此,128个ASCII码字符占一个字节,带注音符的拉丁文、希腊文等语言占两个字节,其他多文种平面字符,例如汉字,占三个字节,其他unicode辅助平面字符的才需要四个字节。

UTF-8和UTF-16,UTF-32的差别

UTF-8的意思是每次传输8-bit。同理UTF-16和UTF-32是一次16-bit,一次32-bit。

UTF8传输的时候对于多余一个字节的字符是分开传输的,那么如何截取一个字符呢?规定:

①第一个字节的第一位为0,那么这个字符占一个字节。

②第一个字节前三位为110,第二个字节前两位为10,那么这个字符占两个字节。

③第一个字符前四位为1110,后两个字节前两位为10,那这个字符占三个字节。
①情况等同于ASCII码,②情况可以解释为什么加注音符的语言,8位二进制可以表示,为什么占两个字节?因为为了扩展128-255号位置,最高位不为0了,传输时高位不为0不能代表一个字节,不是一个字节,传输时肯定涉及截取,第一个字节和第二个字节加入了110和10,就不再是8位了,而是13位,多余的位0补全。需要2个字节来存储。③同理解释两个字节可以表示的汉字,为什么要占三个字节,因为加入了截取时识别的数字1110,10和10。

UTF16传输的时候,就不会涉及截取时计算机不知怎么截取的情况,因此,英文、其他拼音语音和汉字都可以用UTF-16传输,只是在传输英文的时候,会有浪费。对于多于8-bit传输的会有字节序的问题,例如526A和6A52分别表示两个汉字,当UTF16传输来一个526A的时候到底表示哪一个呢?在unicode编码中,有一个FEFF的字符,它本是不存在的,不该出现在实际传输中,但是它作为字节序的标识而首先传输过去。当接受者接收到FEFF的时候,说明这个字符是低地址存放最高有效字节;当接收到FFFE时,说明这个字符是低地址存放最低有效字节。

对于UTF8和UTF16在传输字符串时候,UTF-8节省流量;在传输加注音符的语言的时候,是一样的,占两个字节;在传输平面文字,例如汉字的时候,UTF-16节省流量。

UTF-32在没有特殊的癖好和需求的话,暂时用不上。


总结,Unicode是内存编码的表示的方案(规范),UTF是计算机如何存储识别和传输的方案(实现),对于多数使用在国内的网站,编码一般用GB系列的,国际通用的网站编码一般用UTF8。



0 0