
1.2.4 字符的编码
字符是指计算机中使用的字母、数字、字和符号。由于计算机是以二进制的形式存储和处理数据,因此字符也必须按特定的规则进行字符编码以便计算机能处理。这里指的字符编码是指把字符集中的字符编码为指定集合中某一对象以便文本在计算机中存储和通过通信网络的传递。
1.西文字符的编码
西文字符也都用二进制数来表示。与数值型数据的主要差别是,一切西文字符都是照事先约定的编码值来表示。计算机中最常用的字符编码是ASCII码,全名是“美国国家信息交换标准代码”(American Standard Code for Information Interchange),原为美国国家标准,后来被ISO(国际标准化组织)采用。ASCII码于1961年提出,用于在不同计算机硬件和软件系统中实现数据传输标准化,在大多数的小型机和全部的个人计算机都使用此码。
ASCII通常为七位码,共计为128个(0、1七位码),这128个字符组成如下:
0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(【Enter】键)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10和13分别转换为退格、制表、换行和【Enter】键字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。
32~126(共95个)是字符(32是空格),其中48~57为0到9这十个阿拉伯数字。
65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。
一个字符的ASCII码值可直接在ASCII码表中查到,将字符所在列的代码(前三位d6d5d4)与其所在行的代码(后四位d3d2d1d0)拼接在一起,即为该字符的ASCII码。例如在表中可查得,字母“A”的ASCII码为1000001(写成16进制在前面要加0为41H),加号“+”的ASCII码为0101011(写成16进制在前面要加0为2BH),数字“3”数的ASCII码为00110011(写成16进制在前面要加0为33H)。
注意:在标准ASCII中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验确保一个字节中1的个数必须是奇数,校验位为0;若非奇数,则校验位为1。偶校验确保一个字节中1的个数必须是偶数,校验位为0;若非偶数,则校验位为1。
ASCII字符编码表如表1-1-3所示。
表1-1-3 ASCII字符编码表

其中部分ASCII字符解释如表1-1-4所示。
表1-1-4 ASCII字符解释

从表1-1-3中,可以看出,在可以打印的字符里,遵循一定的顺序排列。例如:
(1)数字0~9比字母要小,如“7”<“F”。
(2)数字0比数字9要小,并按0到9顺序递增,如“3”<“8”。
(3)字母A比字母Z要小,并按A到Z顺序递增,如“A”<“Z”。
(4)同一个字母的大写字母比小写字母要小,如“A”<“a”。
2.汉字的编码
由于电子计算机现有的输入键盘与英文打字机键盘完全兼容,但对其他字符的支持不够友好,因而如何输入汉字或者其他非拉丁字符一直是多年来人们研究的课题。从处理流程上来说,汉字信息处理系统一般包括编码、输入、存储、编辑、输出和传输,其中最关键的是编码。
计算机中汉字的表示也是用二进制编码。根据应用目的的不同,汉字编码分为外码、交换码、机内码和字形码。
汉字系统对每个汉字预先规定输入计算机中的代码,即汉字的外部码(例如拼音输入码)。计算机为了识别汉字,要把汉字的输入码转换成国标码再转换成内部码(二进制代码)进行存储和处理。输出时,将汉字的内部码转换成汉字的字形码。计算机处理汉字的过程如图1-1-2所示。

图1-1-2 汉字的计算机处理汉字的过程
1)外码(输入码)
外码也叫输入码,是用来将汉字输入到计算机中的一组键盘符号。常用的输入码有拼音码五笔字形码、区位码和电报码等,一种好的编码应该编码规则简单、好记易学、能够快速输入等优点。
2)交换码(国标码)
计算机内部处理的信息,都是用二进制代码表示的,汉字也不例外。为了使二进制代码使用更方便,所以现实中采用的往往是信息交换码。中国标准总局1981年制定了中华人民共和国国家标准GB2312—1980《信息交换用汉字编码字符集—基本集》(即国标码)。
区位码是国标码的另一种表现形式,把国标GB2312—1980中的汉字、图形符号组成一个94×94的方阵,分为94个“区”,每个区包含94个“位”,其中“区”的序号为01~94,“位”的序号也是01~94。94个区中位置总数=94×94=8836个,其中7445个汉字和图形字符中的每一个占一个位置后,还剩下1391个空位,这1391个位置空下来保留备用。
区位码是一个4位的十进制数,国标码是一个4位的十六进制数,所以国标码并不等于区位码,它是由区位码稍作转换得到,其转换方法为:先将十进制区码和位码转换为十六进制的区码和位码,这样就得到了一个与国标码有一个相对位置差的代码,再将这个代码的第一个字节和第二个字节分别加上20H,就得到国标码。例如:“保”字的国标码为3123H,它的计算过程如下:
(1)通过查询区位码表,得到“保”字位于第17行,第03列,则区位码为1703D。
(2)区位码转换为十六进制:1703D=(1103)H。
(3)将(2)所得结果第一个字节和第二个字节分别加上20H(十进制是32,因为前32个区已经用于表示英文字母、符号、特殊字符等),最终得到(3123)H就是其对应的国标码。对应的二进制表示就是:(0011000100100011)B。
为了与国际标准接轨,中华人民共和国全国信息技术标准化技术委员会1995年12月1日制定了《汉字内码扩展规范(GBK)》,国家技术监督局标准化司、电子工业部科技与质量监督司1995年12月15日联合以技监标函1995 229号文件的形式,将它确定为技术规范指导性文件。目前中文版的Windows XP、Windows 7、Windows 8等都支持GBK编码方案。
3)机内码
根据国标码的规定,每一个汉字都有了确定的二进制代码,在微机内部汉字代码都用机内码,在磁盘上记录汉字代码也使用机内码。
国标码是汉字信息交换的标准编码,但因其前后字节的最高位为0,与ASCII码发生冲突,比如汉字的国标码为32H和23H,而西文字符“2”和“#”的ASCII也为32H和23H,假如内存中有两个字节为32H和23H,这到底是一个汉字,还是两个西文字符“2”和“#”,于是就出现了二义性,显然,国标码是不可能在计算机内部直接采用的,于是,汉字的机内码采用变形国标码,其变换方法为:将国标码的每个字节都加上128(80H,因为前128个都是ASCII,这样就避免了冲突),即将两个字节的最高位由0改1,其余7位不变。
【例1-4】以汉字“大”为例,“大”字的区位码为2083。
【解】(1)区号为20,位号为83。
(2)将区位号2083转换为十六进制表示为1453H。
(3)1453H+2020H=3473H,得到国标码3473H。
(4)3473H+8080H=B4F3H,得到机内码为B4F3H
4)汉字的地址码
汉字地址码是指汉字库中存储汉字字形信息的逻辑地址码。
当需要向输出设备输出汉字时,先通过地址码对汉字库进行访问,获取汉字的字形码,从而显示出汉字。因为在汉字库中,字形信息大多数都是按标准汉字交换码中汉字的排列顺序排列,所以汉字的地址码也是连续存放在存储介质上,而且与汉字内码有着简单的对应关系,以简化内码到地址码的转换。
5)汉字的字形码
汉字最终是要通过输出设备进行输出便于阅读或者打印等,那么就必须将汉字内码转成方便人们阅读的块状汉字,汉字字形码又称汉字字模,也可以称作汉字的输出码,用于汉字在显示屏或打印机上的输出。
汉字字形码通常有两种表示方式:点阵和矢量表示方法。输出汉字时都采用图形方式,无论汉字的笔画多少,每个汉字都可以写在同样大小的方块中。通常简易型的汉字用16×16点阵来显示汉字,普通型汉字可以采用24×24点阵或者48×48点阵来表示,为了适应高清显示,现在的最高能做到256×256点阵等。点阵规模愈大,字形愈清晰美观,所占存储空间也愈大。
为了更加形象地说明字形码,这里以汉字“你”的16×16点阵为例,其字模信息如图1-1-3所示。

图1-1-3 汉字的点阵字形码
在16×16的点阵中用点描出一个汉字,如“你”,计算机将整个点阵分成16列16行。每个点都用一位二进制编码表示,如果该点被用于显示则表示1,否则表示0。这样,在每一行中需要16个二进制位,也就是2B。在此点阵模式下,描述一个汉字就需要32B,即占用32B空间。字形码和具体的字体有关,一般不同的字体有不同的字库,所以,字模点阵只能是用来构成“字库”,而不能作为字的机内码。
点阵式的表示方式容易理解和处理,但是其缺点也很明显,就是存在锯齿现象。还有另外一种表示方式——矢量式,它主要是保持汉字的精调和轮廓,其中轮廓用来描述字体的基本结构,而精调是借助一系列技术,对字体进行微调,从而使得字体更加清晰美观。