乐读窝

程序员的数学思维修炼

乐读窝 > 科普学习 > 程序员的数学思维修炼

4.5计算机中的字符编码

书籍名:《程序员的数学思维修炼》    作者:周颖



通过将数字、字符进行一定的排列,可得到如电话号码、车牌号这类日常用到的信息。类似地,在计算机中也广泛使用这类可重排列进行信息处理。例如,计算机中的字符编码就是一个明显的例子。在计算机中,最初使用的是ASCII码,但是,由于这种编码只能处理英文字符,对于像中文这种有上万种不同字符的情况,就无法处理了。为此,必须引用新的编码,常见的如GB2312、UNICODE等。



4.5.1 ASCII码能表示的字符数量


信息在计算机上是用二进制表示的,这种表示法让人理解起来很困难。因此计算机上都配有输入和输出设备,这些设备的主要目的就是,以一种人类可阅读的形式将信息在这些设备上显示出来,供人们阅读理解。为保证人类和设备、设备和设备之间能进行正确的信息交换,人们编制了统一的信息交换代码,这就是ASCII码,它的全称是“American  Standard  Code  for  Informatio”(美国信息交换标准代码)。

1.标准ASCII码

ASCII是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语和其他西欧语言,是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC  646。

在ASCII码的最初编码规则中,规定使用7位二进制来表示一个字符。那么,按这种规则,ASCII码有多少个不同的编码呢?也就是说能表示多少个不同的信息呢?

一个ASCII码可能如下所示,其中8位二进制中的每一位可取0或1。

根据前面学习的计算可重排列数的规则来计算,每一位二进制位有2种可能(即n=2),其位数为7(即m=7),则:

即,ASCII码可表示128种不同的信息。如表4-1所示就是计算机中用到的ASCII码表,每一个编码对应一个控制字符或一个英文字母、数字、特殊符号。

从表4-1的ASCII码表中可发现一些编码的大小规则:

表4-1 ASCII码表

数字0~9比字母的编码小,如"9"<"A";

数字0比数字9的编码小,并按0~9顺序递增,如“2”<“3”;

字母A比字母Z的编码小,并按A到Z顺序递增,如“A”<“B”;

相同字母的大写字母比小写字母编码小,如“A”<“a”。

无论在哪种程序设计语言中,ASCII的编码规则都是相同的。在程序中比较两个字符串的大小时,默认都是按各字符对应的ASCII码的大小来进行比较。因此,程序员应记住以上规则。

根据以上编码的大小规则,只要记住数字“0”和字母“A”、“a”的ASCII码分别为48、65、97,就可以推导出后续数字或字母的ASCII码了。

2.扩展ASCII码

ASCII是美国标准,所以它不能很好地满足其他非英语国家的需要。例如英国的英镑符号(£)在表4-1中就没有。

在使用过程中还发现ASCII码有以下问题:

没有拉丁语字母表重音符号。

没有斯拉夫字母表的希腊语、希伯来语、阿拉伯语和俄语中的符号。

没有中国汉字系统的象形汉字符号。

没有日本和朝鲜文符号。

为了适应计算机的发展,逐渐出现了扩展ASCII码。由于计算机中一个字节为8位二进制,而标准ASCII码只使用了7位。将8位二进制都用来表示ASCII码,就可扩展其表示范围。8位二进制可表示的编码数量为:

增加一位二进制,可扩充一倍的编码数量。

扩展ASCII码表除了前面0~127这部分与表4-1的标准ASCII码相同之外,还增加了128~255这128个编码,如表4-2所示。

表4-2 扩展ASCII码表



4.5.2 能表示更大范围的编码


参考表4-1和表4-2可看出,包含扩展ASCII码在内,一共只能表示256个符号,只包括了一些字符、数字、标点符号的信息表示。这主要是因为计算机是美国发明的,在英文下面,我们使用ASCII码表示就足够了!但是在汉字输入时,用ASCII码就不能表示所有的汉字了(仅常用汉字就上万个)。

1.用双字节和4字节进行编码

怎么来唯一地表示成千上万的汉字呢?根据我们前面介绍的排列规则,由于计算机中信息只能使用二进制表示,每一个二进制位只能为0或1(相当于在排列中的n值为固定的2),因此,只有增加二进制位数(相当于增加m的值),这样才能扩大排列数,以表示更多的汉字或其他符号。

在现在的计算机中,虽然最小处理单位为一个二进制位,但在读取或存储数据时,通常都是按字节进行处理的。一个ASCII码正好是一个字节(8位二进制),要扩展字符的编码,就可考虑采用2个字节(16位二进制位),则可表示的符号数为:

一般来说,65536个排列数应该能够保存常用的汉字和符号了。所以,现在常见的中文编码(有很多中文编码方案)都采用2个字节来表示一个汉字,称为双字节形式。

可是,双字节汉字编码仍然不够用。汉字的数量非常庞大,总量是多少,大家没有一个统一的说法。有“总汇汉字之大成”评价的《康熙字典》,收录的汉字是4万多个。1994年出版的《中华字海》收入了87019个汉字,而已经通过专家鉴定的北京国安咨询设备公司的汉字字库,收录有出处的汉字91251个,据称是目前全国最全的字库。

可以看出,双字节编码仍然不够用,因此又出现了4字节编码。4个字节共32位二进制位,可排列出的数量为:

4字节编码就足够大了,排列数可达到40多亿,可以将世界上所有语言的符号都进行唯一编码。

2.认识Unicode

Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。Unicode于1990年开始研发,1994年正式公布。随着计算机工作能力的增强,Unicode也在面世以来得到迅速普及。

Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。Unicode用数字0~0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字。

在Word中打开“符号”对话框,可看到汉字或符号的Unicode编码,如图4-18所示。

图4-18

其实在Unicode之前,一共存在过3套中文编码标准,分别是:

GB2312-80:是中国大陆使用的国家标准,其中一共编码了6763个常用简体汉字。

Big5:是台湾使用的编码标准,编码了台湾使用的繁体汉字,大概有8千多个。

HKSCS:是中国香港使用的编码标准,字体也是繁体,但跟Big5有所不同。

这些编码标准为了表示上万的汉字,都是使用了16位二进制位的排列来进行编码。虽然这3套编码标准都采用了两个扩展ASCII的方法来表示一个汉字,但它们编码区间各不相同,因此这3套编码互不兼容。这就导致在同一个系统中同时显示GB和Big5基本上是不可能的。