162°

漫谈计算机编码:从ASCII码到UTF-8

第一阶段 ASCII码

计算机大家都知道,本质是二进制运算和存储。在计算机中人类的几乎所有文字和字符都没法直接表示,所以美国人在发明计算机的时候为了让计算机可以用于保存和传输文字,就发明了ASCII码(American Standard Code for Information Interchange,美国信息交换标准代码),用128个数字分别映射到美国人常用的一些字符,一个字符只占用一个字节。这样一来就满足了美国人的交流需要。

 

第二阶段  GBK

但是计算机这东西真的是太好用了,只在美国使用有点暴殄天物,其他国家为了能让计算机在自己国家也好用,就发明了自己的编码系统来适配自己国家的文字和字符,比如西欧国家的Windows-1252和中国的GBK以及港澳台地区用得比较多的Big5。

因为ASCII只有128个,用二进制7位就够了,而计算机的最小存储单位byte是8位,所以ASCII码中每个字节的最高位永远是0,因此这些国家在搞自己的编码的时候很容易地就保持了对ASCII的兼容,即当每个字节最低位为0的时候表示ASCII码,为1的时候表示自己国家的编码。

以中文GBK为例,GBK使用固定的两个字节,当解析到的字节最高位为0时,只解析当前字节作为ASCII码,当最高位为1的时候,就将下一个字节读进来一起解析为一个汉字,而不用考虑第二个字节的最高位,然后跳到第三个字节继续解析,往复如此直到解析完成。

其他国家和地区的编码系统也大致如此。

 

第三阶段 Unicode

现在问题来了,每个国家在设计自己国家的编码的时候基本上都只考虑了自己国家的需求,导致不同国家之间的编码互不兼容,这给不同国家之间的交流造成了很大的阻碍和困扰。

这时候就需要有人来干秦始皇干活的“车同轨、书同文”的事了,于是就出现了Unicode。Unicode为世界上所有字符设定了统一并且唯一的数字序号,这个编号范围从0x000000到0x10FFFF,包括110多万。也就是说,世界上所有国家的文字和字符都能在Unicode中找到唯一的序号,这样一来大家就有统一的标准。

 

第四阶段 UTF-8

但是,Unicode只规定了编号,没有规定编号到二进制的映射方式。

我们先做最简单的设想:在计算机中使用固定数量的字节来存储Unicode,即直接存储所有的字符编号的二进制编码。但这样的话对于编号比较小的那些字符来讲高位全都是0,非常浪费空间,再考虑到最常用的字符编号都比较小,这么做的话对于网络传输速度和存储空间都是极大的浪费,所以我们需要一种变长的Unicode映射方式,于是就出现了UTF-8。

UTF-8就是使用变长字节表示,每个字符使用的字节个数与其Unicode编号的大小有关,编号小的使用的字节就少,编号大的使用的字节就多,使用的字节个数从1到4个不等。这样一来存储同样多的信息需要的内存空间就便少了很多,在网络通信中获取信息的效率也会提升很多。

UTF-8的优势如此明显,所以它很快就席卷了全球,成为了大家最常用的编码。

 

一点补充:

UTF-8编码中,大多数中文占用的字节数是3个,相较于GBK的2个,多出了1/3,这也就意味着在存储纯中文文档的时候,UTF-8编码的文件占用空间是GBK编码文件的1.5倍。

基于上面这项特性,GBK在很多纯中文系统中还是有很大的应用市场。其目的呢,就是为了节省用户的硬盘和流量

 

转载自:博客园

全部评论: 0

    我有话说: