1.5.2 非数值数据的编码

由于计算机只能识别二进制代码,数字、字母、符号等必须以特定的二进制代码来表示,称为它们的二进制编码。

1.十进制数字的编码

前面的学习中提到当十进制小数转换为二进制数时将会产生误差,为了精确地存储和运算十进制数,可用若干位二进制数码来表示一位十进制数,称为二进制编码的十进制数,简称二—十进制代码(Binary Code Decimal,BCD)。由于十进制数有10个数码,起码要用4位二进制数才能表示1位十进制数,而4位二进制数能表示16个符号,所以就存在有多种编码方法。其中8421码是常用的一种编码方法,它利用了二进制数的展开表达式形式,即各位的位权由高位到低位分别是8、4、2、1,方便了编码和解码的运算操作。若用BCD码表示十进制数2365就可以直接写出结果:0010001101100101。

2.字母和常用符号的编码

在英语书中用到的字母为52个(大、小写字母各26个),数码10个,数学运算符号和其他标点符号等约32个,再加上用于打字机控制的无图形符号等,共计128个符号。对128个符号编码需要7位二进制数,且可以有不同的排列方式,即不同的编码方案。其中美国标准信息交换码(American Standard Code for Information Interchange,ASCII)是使用最广泛的字符编码方案。ASCII编码表如表1.2所示。

表1.2 ASCII编码表(b7b6b5b4b3b2b1

续表

ASCII代码在初期主要用于远距离的有线或无线电通信中,为了及时发现在传输过程中因电磁干扰引起的代码出错,设计了各种校验方法,其中奇偶校验是采用最多的一种,即在7位ASCII代码之前再增加一位用作校验位,形成8位编码。若采用偶校验,即选择校验位的状态使包括校验位在内的编码内所有为“1”的位数之和为偶数。例如,大写字母“C”的7位编码是“1000011”,共有3个“1”,则使校验位置“1”,即得到字母“C”的带校验位的8位编码“11000011”;若原7位编码中已有偶数位“1”,则校验位置“0”。在数据接收端则对接收的每一个8位编码进行奇偶性检验,若不符合偶数个(或奇数个)“1”的约定就认为是一个错码,并通知对方重复发送一次。由于8位编码的广泛应用,8位二进制数也被定义为一个字节,成为计算机中的一个重要单位。

3.汉字编码

汉字是世界上使用最多的文字,是联合国的工作语言之一,汉字处理的研究对计算机在我国的推广应用和加强国际交流都是十分重要的。但汉字属于图形符号,结构复杂,多音字和多义字比例较大,数量太多(字形各异的汉字据统计有50000个左右,常用的也在7000个左右)。这些导致汉字编码处理和西文有很大的区别,在键盘上难于表现,输入和处理都难得多。依据汉字处理阶段的不同,汉字编码可分为输入码、显示字形码、机内码和交换码。

在键盘输入汉字用到的汉字输入码现在已经有数百种,商品化的也有数十种,广泛应用的有五笔字型码、全/双拼音码、自然码等。但归纳起来可分为数字码、拼音码、字形码和音形混合码。数字码以区位码、电报码为代表,一般用4位十进制数表示一个汉字,每个汉字编码唯一,记忆困难。拼音码又分全拼和双拼,基本上无须记忆,但重音字太多。为此又提出双拼双音、智能拼音和联想等方案,推进了拼音汉字编码的普及使用。字形码以五笔字型为代表,优点是重码率低,适用于专业打字人员应用,缺点是记忆量大。自然码则将汉字的音、形、义都反映在其编码中,是混合编码的代表。

要在屏幕或在打印机上输出汉字,就需要用到汉字的字形信息。目前表示汉字字形常用点阵字形法和矢量法。

点阵字形是将汉字写在一个方格纸上,用一位二进制数表示一个方格的状态,有笔画经过记为“1”,否则记为“0”,并称其为点阵。把点阵上的状态代码记录下来就得到一个汉字的字形码。显然,同一汉字用不同的字体或不同大小的点阵将得到不同的字形码。由于汉字笔画多,至少要用16×16的点阵(简称16点阵)才能描述一个汉字,这就需要256个二进制位,即要用32字节的存储空间来存放它。若要更精密地描述一个汉字就需要更大的点阵,比如24×24点阵(简称24点阵)或更大。将字形信息有组织地存放起来就形成汉字字形库。一般16点阵字形用于显示,相应的字形库也称为显示字库。

矢量字形则是通过抽取并存放汉字中每个笔画的特征坐标值,即汉字的字形矢量信息,在输出时依据这些信息经过运算恢复原来的字形。所以矢量字形信息可适应显示和打印各种字号的汉字。其缺点是每个汉字需存储的字形矢量信息量有较大的差异,存储长度不一样,查找较难,在输出时需要占用较多的运算时间。

有了字形库,要快速地读到要找的信息,必须知道其存放单元的地址。当输入一个汉字并要把他显示出来,就要将其输入码转换成为能表示其字形码存储地址的机内码。根据字库的选择和字库存放位置的不同,同一汉字在同一计算机内的内码也将是不同的。

汉字的输入码、字形码和机内码都不是唯一的,不便于不同计算机系统之间的汉字信息交换。为此我国制定了《信息交换用汉字编码字符集基本集》,即GB 2312—80,提供了统一的国家信息交换用汉字编码,称为国标码。该标准集中规定了682个西文字符和图形符号、6763个常用汉字。6763个汉字被分为一级汉字3755个和二级汉字3008个。每个汉字或符号的编码为两字节,每个字节的低7位为汉字编码,共计14位,最多可编码16384个汉字和符号。为避开ASCII代码中的控制码,国标码规定了94×94的矩阵,即94个可容纳94个汉字的“区”,并将汉字在区中的位置称为“位号”。一个汉字所在的区号和位号合并起来就组成了该汉字的区位码。利用区位码可方便地换算为机内码:

高位内码=区号+20H+80H

低位内码=位号+20H+80H

其中,加20H是为了避开ASCII的控制码(在0~31);加80H是把每字节的最高位置“1”以便于与基本的ASCII代码区分开来。

除了GB 2312—80外,GB 7589—87和GB 7590—87两个辅助集也对非常用汉字作出了规定,三者定义汉字共21039个。