字符集编码

将每个字符都使用一个数字表示,显示的时候自动将该数字替换为对应的字符,这就是现代的字符编码的意思

一开始,电脑只有西方在用,所以它们将26个英文字母和一些常用字符使用0-127这些数字表示,即一个字符只占一个字节,这就是最初的ASCII码表

后来越来越多非拉丁字符的地区需要使用电脑,于是各个地区或国家都创建了对应自己国家文字的编码表,比如中国大陆就创建了 GB2312、台湾地区的big5、德国的 IA5等,它们都是将自己的文字使用一个数字一一对应上,但总的来说前128位编码都还是拉丁文那一套。这些不同地区的编码同城为 ANSI 编码(即国内说的ANSI可能指的是GB2312,到台湾地区可能又指的是big5等)

问题来了,同一个数字在不同的地区可能表示不同的字符,所以查看一个文档,就需要计算机中装有该文档对应的字符集编码。

所以,有人就创建了 Unicode 字符集编码,它将全世界所有的字符全都收集起来,组成一个大的编码集。如此一来,理论上全世界都只用这一个编码即可。这里需要注意的一点是,这里所说的Unicode指的是编码表,即哪个数字对应哪个字符,但是没有规定如何在磁盘进行存储

问题来了,由于Unicode需要囊括所有的字符集,单单一个字节以及不足以存储一个字符所表示的数字了,所以可能每个字符都需要两个字节甚至四个字节来表示,例如原来字母a使用数字 96 表示,现在需要使用 0096 甚至 000096 来表示(每个字符都固定长度,用于对齐填充)。这样一来使用拉丁文的国家就不干了,因为原本只占用一倍的存储空间现在变成了两倍甚至四倍。

所以,在 Unicode 的基础上,有人就发明了 utf-8、utf-16等,它们能够自动识别当前字符是什么类型的字符,如果是拉丁字符,则存储时仍然只占用一个字节,如果是中文字符,则占用两个字节等等。不必纠结它如何实现这个功能的,但必须要明确的一点是,utf-8只是Unicode的一种存储方式,它本质上仍然使用的是Unicode编码表。也就是说,utf-8会将两个字节的 0096(表示Unicode中的a) 仍然以 96 这种单字节的方式存储在磁盘,相对应的,那种直接将 0096 存储到磁盘的方式就叫 UCS-2

以上就是它们的基本关系,另外还有一些编码,例如 iso8859,它是对ASCII的扩充,但仍然只支持拉丁文,GBK是对GB2312的扩充等。

最容易搞混的一点就是Unicode了,因为它有的时候表示的是Unicode字符集(字符到数字的映射),有的时候又表示字符的存储方式(UCS-2),网上有一张图

这里的Unicode就是指的 UCS-2。ANSI指的是该系统所用的编码。

Leave a Comment