1、严格来说,字符集和字符编码不是一个概念,字符集定义了文字和二进制的对应关系,为字符分配了唯一的编号,而字符编码规定了如何将文字的编号存储到内存中。我们暂时先不讨论这些细节,姑且认为它们是一个概念,本节中我也混用了这两个概念,未做区分。下一节我们将深入讲解字符集和字符编码的区别。
2、字符集为每个字符分配一个唯一的编号,类似于学生的学号,通过编号就能够找到对应的字符。可以将字符集理解成一个很大的表格,它列出了所有字符和二进制的对应关系,计算机显示文字或者存储文字,就是一个查表的过程。在计算机逐步发展的过程中,先后出现了几十种甚至上百种字符集,有些还在使用,有些已经淹没在了历史的长河中,本节我们就来了解一下。
3、拉丁字母:在正式介绍计算机的字符集之前,我们先来说说什么是拉丁字母。估计也有不少读者和我一样,对于拉丁字母、英文字母和汉语拼音中的字母的关系不是很清楚。拉丁字母也叫罗马字母,它源自希腊字母,是当今世界上使用最广的字母系统。基本的拉丁字母就是我们经常见到的 ABCD 等26个英文字母。拉丁字母、阿拉伯字母、斯拉夫字母(西里尔字母)被称为世界三大字母体系。拉丁字母原先是欧洲人使用的,后来由于欧洲殖民主义,导致这套字母体系在全球范围内开始流行,美洲、非洲、澳洲、亚洲都没有逃过西方文化的影响。中国也是,我们现在使用的拼音其实就是拉丁字母,是不折不扣的舶来品。后来,很多国家对 26 个基本的拉丁字母进行了扩展,以适应本地的语言文化。最常见的扩展方式就是加上变音符号,例如汉语拼音中的ü,就是在u的基础上加上两个小点演化而来;再如,áà就是在a的上面标上音调。总起来说:基本拉丁字母就是 26 个英文字母;扩展拉丁字母就是在基本的 26 个英文字母的基础上添加变音符号、横线、斜线等演化而来,每个国家都不一样。
4、ASCII 编码计算机是美国人发明的,他们首先要考虑的问题是,如何将二进制和英文字母(也就是拉丁文)对应起来。当时,各个厂尸园拽诟家或者公司都有自己的做法,编码规则并不统一,这给不同计算机之间的数据交换带来不小的麻烦。但是相对来说,能够得到普遍认可的有 IBM 发明的 EBCDIC 和此处要谈的 ASCII。我们先说 ASCII。ASCII 是“American Standard Code for Information Interchange”的缩写,翻译过来是“美国信息交换标准代码”。看这个名字就知道,这套编码是美国人给自己设计的,他们并没有考虑欧洲那些扩展的拉丁字母,也没有考虑韩语和日语,我大中华几万个汉字更是不可能被重视。但这也无可厚非,美国人自己发明的计算机,当然要先解决自己的问题ASCII 的标准版本于 1967 年第一次发布,最后一次更新则是在 1986 年,迄今为止共收录了 128 个字符,包含了基本的拉丁字母(英文字母)、阿拉伯数字(也就是 1234567890)、标点符号(,.!等)、特殊符号(@#$%^&等)以及一些具有控制功能的字符(往往不会显示出来)。
5、查阅了 AS觊皱筠桡CII 编码表的读者会发现,26 个拉丁字母和阿拉伯数字都是连续分布的,这给程序设计带来了很大的方便。例如要判断一个字符是否是大写字母,就可以判断该字符的 ASCII 编码值是否在 65~90 的范围内。EBCDIC 编码正好相反,它的英文字母不是连续排列的,中间出现了多次断续,给编程带来了一些困难。现在连 IBM 自己也不使用EBCDIC 了,转而使用更加优秀的 ASCII。ASCII 编码已经成了计算机的通用标准,没有人再使用EBCDIC 编码了,它已经消失在历史的长河中了。查阅了 ASCII 编码表的读者会发现,26 个拉丁字母和阿拉伯数字都是连续分布的,这给程序设计带来了很大的方便。例如要判断一个字符是否是大写字母,就可以判断该字符的 ASCII 编码值是否在 65~90 的范围内。EBCDIC 编码正好相反,它的英文字母不是连续排列的,中间出现了多次断续,给编程带来了一些困难。现在连 IBM 自己也不使用EBCDIC 了,转而使用更加优秀的 ASCII。ASCII 编码已经成了计算机的通用标准,没有人再使用EBCDIC 编码了,它已经消失在历史的长河中了。
6、由于 ASCII 先入为主,已经使用了十来年了,现有的很多软件和文档都是基于 ASCII 的,所以后来的这些字符编码都是在 ASCII 基础上进行的扩展,它们都兼容 ASCII,以支持既有的软件和文档。兼容 ASCII 的含义是,原来 ASCII 中已经包含的字符,在国家编码(地区编码)中的位置不变(也就是编码值不变),只是在这些字符的后面增添了新的字符。
7、Unicode(统一码、万国码)上面提到的字符编码是各个国家为自己的语言文化患束锍瓜开发的,不具有通用性,在一种编码下开发的软件或者编写的文档,拿到另一种编码下就会失效,团蝣逅捎必须提前使用程序转码,非常麻烦。人们迫切希望有一种编码能够统一世界各地的字符,计算机只要安装了这一种字编码,就能支持使用世界上所有的文字,再也不会出现乱码,再也不需要转码了,这对计算机的数据传递来说是多么的方便呀!就在这种呼吁下,Unicode 诞生了。Unicode 也称为统一码、万国码;看名字就知道,Unicode 希望统一所有国家的字符编码。Unicode 于1994 年正式公布第一个版本,现在的规模可以容纳 100 多万个符号,是一个很大的集合。Windows、Linux、Mac OS 都已经从底层开始支持 Unicode,大部分的网页和软件也使用 Unicode,Unicode 是大势所趋。不过,目前的计算机仍然安装了 GB2312、GBK、Big5、Shift-JIS 等国家编码,以支持不使用 Unicode 的软件或者文档。
8、由于历史原因,现代的操作系统同时支持 ASCII、国家编码(地区编码)、Unicode 编码,但是在底层已经开始使用 Unicode,有的操作系统会将其它编码先转换成 Unicode 后再进一步处理,Unicode 已经是大势所趋。大家在开发自己的软件时也应该尽量使用 Unicode,这样不但支持全球的计算机,还能提高字符处理效率,因为少了编码转换的环节。