字符集及其编码(字符串编码的前世今生)

平常写代码的过程中,我们经常会碰到编码的问题。什么utf-8、GBK、GB2312一大堆编码,有时候一个乱码问题可以把一个程序员搞得奔溃。今天我们就捋一捋这些编码的“前世今生”。

一、最早的ASCII码

字符集及其编码(字符串编码的前世今生)(1)

世界上第一台计算机是由美国人发明的。美国人采用的是英语,我们都知道英语都有26个字母,26个大小写的字母再加上一些标点符号,数量是很小的。所以他们规定了一套编码,这套编码只能存储128个字符,这就是最早的计算机编码:ASCII码。ASCII码中的每个字符都用8个bit位表示。例如A的8个比特位是01000001,转换成10进制就是65。这8个比特位的最高位都是0,也就是最高位ASCII并没有用到。

二、ISO-8859的时代

字符集及其编码(字符串编码的前世今生)(2)

随着计算机的发展,欧洲的国家开始使用计算机,随着而来的问题也出现了。欧洲的一些语言并不想英语这么简单,在很多欧洲语言中,一些单词有注音符号。这导致128个ASCII字符远远不够用。聪明的欧洲人决定启用ASCII的最高位0,这样一来就将ASCII扩展到了256位(2的8次方),这就是ISO-8859的时代。在ISO-8859的时代,每个国家都规定了自己的ISO-8859。例如:西欧的ISO/IEC 8859-1、中欧的ISO/IEC 8859-2、南欧的ISO/IEC 8859-3、北欧的ISO/IEC 8859-4等等。但这些编码中0-127表示的符号是一样的,128-255这一段都是不一样的。也就是说 ISO-8859是向下兼容ASCII的。

三、中国人民的崛起

字符集及其编码(字符串编码的前世今生)(3)

计算机发展的很迅速,很快传入了亚洲,传入了中国。中国的文字博大精深,光常用的汉字就多达几千个,ASCII和ISO-8859显然都是不适用的。所以聪明的中国人想到了一个办法:用2个字节表示一个汉字。我们知道ASCII但是单字节的,1个字节可以表示256个字符,那两个字节就可以表示256*256= 65536个汉字,这就基本可以满足我们了,这就是最早的GB2312编码。

GB2312中收录了大概有7000个汉字,同时收录了拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的 682 个字符。

但是随着的问题有出现了。在GB2312使用的过程中发现一些生僻字无法处理,所以就出现了GBK。GBK设计兼容GB2312的,收录了2万多的汉字和图形符号。包括:

  • GB 2312 中的全部汉字、非汉字符号。
  • BIG5 中的全部汉字。
  • 与 ISO 10646 相应的国家标准 GB 13000 中的其它 CJK 汉字,以上合计 20902 个汉字。
  • 其它汉字、部首、符号,共计 984 个。

为了进一步扩展编码所能表示更多的汉字。信息产业部和国家质量技术监督局在2000年发布了GB 18030。GB 18030总共收录了7万多汉字,并且兼容GBK和GB2312。到这里中国基本所有的汉字就可以在计算机中表示了。

四、Unicode统一天下

字符集及其编码(字符串编码的前世今生)(4)

随着各种字符集的出现,计算机越来越混乱,不同国家的计算机用的是不用的编码,导致谁也不懂谁的编码。这时候unicode横空出世。它的目标就是废弃所有国家的字符集,采用统一的字符集编码。它规定,一个字符必须用2个字节表示。对于ASCII码中的规定保持不变,但是将8位扩展到16位,前8位用0表示,例如:00000000 01000001来表示大写字母A,这对于西方国家而言,这就是对存储空间的一种浪费。所以西方世界很难接受。

五、UTF的时代

字符集及其编码(字符串编码的前世今生)(5)

Unicode在很长的一段时间举步维艰,难以推动。随着互联网大风的席卷,为了解决字符在网络传输的问题。针对Unicode的问题,出现了UTF系列,这里最具代表性的就是UTF-8。UTF-8是目前在互联网上使用最广的编码方式,它是对unicode的一种完美的实现方式。它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,注意的是unicode一个中文字符占2个字节,而UTF-8一个中文字符占3个字节,从unicode到utf-8并不是直接的对应,而是要过一些算法和规则来转换。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页