1.3.4 计算机中信息的编码
在计算机中,各种信息都是以二进制编码的形式存在的;也就是说,不管是文字、图形、声音、动画,还是电影等各种信息,在计算机中都是以0和1组成的二进制代码表示的;计算机之所以能区别这些信息的不同,是因为它们采用的编码规则不同。
“数”不仅仅用来表示“量”,它还能作为“码”(Code)来使用。例如,每一个学生入学后都会有一个学号,这就是一种编码,编码的目的之一是便于标记每一个学生。又如,在键盘上输入英文字母B,存入计算机的是B的编码01000010,它已不再代表数量值,而是一个字符信息。这里介绍最常用的几种计算机编码。
1.BCD码
BCD码亦称二进码十进数或二-十进制代码。用4位二进制数来表示1位十进制数中的0~9这10个数码。是一种二进制的数字编码形式,用二进制编码的十进制代码。BCD码利用4位储存一个十进制的数码,使二进制和十进制之间的转换得以快捷进行。这种编码技巧最常用于会计系统的设计里,因为会计制度经常需要对很长的数字串作准确的计算。相对于一般的浮点式记数法,采用BCD码,既可保存数值的精确度,又可避免计算机进行浮点运算时所耗费的时间。此外,对于其他需要高精确度的计算,BCD码亦很常用。
BCD编码的形式有很多种,通常所采用的是8421编码。这种编码方法是用4位二进制数表示1位十进制数,自左向右每一位所对应的权分别是8、4、2、1。4位二进制数有0000~1111共16种组合形式,但只取前面0000~1001的10种组合形式,分别对应十进制数的0~9,其余6种组合形式在这种编码中没有意义。
BCD编码方法较为简单、自然、容易理解,且书写方便、直观、易于识别,如十进制数2469,其BCD编码为
2.ASCII码
在计算机中,所有的数据在存储和运算时都要使用二进制数表示。美国标准信息交换代码是由美国国家标准学会(American National Standard Institute,ANSI)制定的,标准的单字节字符编码方案,用于基于文本的数据。起始于20世纪50年代后期,在1976年定案。它最初是美国国家标准,供不同计算机在相互通信时作用共同遵守的西文字符编码标准,它已被国际标准化组织(International Organization for Standardization,ISO)定为国际标准。称为ISO 646标准。适用于所有拉丁文字字母。
ASCII码有两个版本,即标准ASCII码和扩展的ASCII码。
标准ASCII码是7位码(b6~b0),即用7位二进制数来编码,用一个字节存储或表示,其最高位(b7)总是0。7位二进制数总共可编出27=128个码,表示128个字符。标准ASCII码具有如下特点:
①码值000~031(0000000~0011111)对应的字符共32个,通常为控制符,用于计算机通信中的控制或设备的功能控制,有些字符可显示在屏幕上,有些则无法显示在屏幕上,但能看到其效果(如换行字符、响铃字符),如表1-4所示。
表1-4 常用字符与ASCII代码对照表(000~031)
②码值为032(0100000)是空格字符,码值为127(1111111)是删除控制符。码值033~126(0100001~1111110)为94个可打印字符,如表1-5所示。
表1-5 常用字符与ASCII代码对照表(032~127)
续表
③0~9这10个数字字符的高3位编码为011(30H),低4位编码为0000~1001,低4位的码值正好是数字字符的数值,即数字的ASCII码正好是48(30H)加数字,掌握这一特点可以方便地实现ASCII码与二进制数的转换。
④英文字母的编码是正常的字母排序关系,大、小写英文字母的编码仅仅是b5一位不同,大写字母的ASCII码的b5位为“0”,小写字母的ASCII码的b5位为“1”,即大、小写英文字母的ASCII码值相差32(b5位的权值为25=32)。掌握这一特点可以方便地实现大小写英文字母的转换。
扩展的ASCII码是8位码(b7~b0),即用8位二进制数来编码,用一个字节存储表示。8位二进制数总共可编出28=256个码,它的前128个码与标准的ASCII码相同,后128个码表示一些花纹图案符号。
3.汉字编码
汉字信息在计算机内部处理时要被转化为二进制代码,这就需要对汉字进行编码。相对于ASCII码,汉字编码有许多困难,如汉字量大,字形复杂,存在大量一音多字和一字多音的现象。
汉字编码技术首先要解决的是汉字输入、输出以及在计算机内部的编码问题,不同的处理过程使用不同的处理技术,有不同的编码形式。汉字编码处理过程如图1-7所示。
图1-7 汉字编码处理过程
(1)输入码
汉字输入码又称“外码”,是用来将汉字输入到计算机中的一组键盘符号。英文字母只有26个,可以把所有的字符都放到键盘上,而使用这种办法把所有的汉字都放到键盘上,是不可能的。所以汉字系统需要有自己的输入码体系,使汉字与键盘能建立对应关系。目前常用的输入码有拼音码、五笔字型码、自然码、表形码、认知码、区位码和电报码等,一种好的编码应有编码规则简单、易学好记、操作方便、重码率低、输入速度快等优点,每个人可根据自己的需要进行选择。在后面的章节中,重点介绍智能全拼输入法和五笔字型输入法。
(2)交换码
计算机内部处理的信息,都是用二进制代码表示的,汉字也不例外。而二进制代码使用起来很不方便,于是需要采用信息交换码。我国标准总局1981年制定了中华人民共和国国家标准GB 2312—1980《信息交换用汉字编码字符集基本集》,即国标码。国标码字符集中收集了常用汉字和图形符号7445个,其中图形符号682个,汉字6763个,按照汉字的使用频度分为两级,第一级为常用汉字3755个,第二级为次常用汉字3008个。为了避开ASCII字符中的不可打印字符0100001~1111110(十六进制为21~7E),国标码表示汉字的范围为2121~7E7E(十六进制)。
区位码是国标码的另一种表现形式,把国标GB 2312—1980中的汉字、图形符号组成一个94×94的方阵,分为94个“区”,每区包含94个“位”,其中“区”的序号由01至94,“位”的序号也是从01至94。94个区中位置总数=94×94=8836个,其中7445个汉字和图形字符中的每一个占一个位置后,还剩下1391个空位,这1391个位置空下来保留备用。所以给定“区”值和“位”值,用4位数字就可以确定一个汉字或图形符号,其中前两位是“区”号。后两位是“位”号,如“普”字的区位码是“3853”,“通”字的区位码是“4508”。区位码编码的最大优点是没有重码,但由于编码缺少规律,很难记忆。使用区位码的主要目的是输入一些中文符号或无法用其他输入法输入的汉字、制表符以及日语字母、俄语字母、希腊字母等。94个区可以分为五组:
01~15区:是各种图形符号、制表符和一些主要国家或地区的语言字母,其中01~09区为标准符号区,共有682个常用符号。
10~15区:为自定义符号区,可留作用户自己定义。
16~55区:是一级汉字区,共有3755个常用汉字,以拼音为序排列。
56~87区:是二级汉字区,共有3008个次常用汉字,以部首为序排列。
88~94区:自定义汉字区,可留作用户自己定义。
(3)机内码
字形码是汉字的输出码,输出汉字时都采用图形方式,无论汉字的笔画有多少,每个汉字都可以写在同样大小的方块中。为了能准确地表达汉字的字形,对于每一个汉字都有相应的字形码,目前大多数汉字系统中都是以点阵的方式存储和输出汉字的字形。所谓点阵就是将字符(包括汉字图形)看成一个矩形框内一些横竖排列的点的集合,有笔画的位置用黑点表示,没笔画的位置用白点表示。在计算机中用一组二进制数表示点阵,用0表示白点,用1表示黑点。一般的汉字系统中汉字字形点阵有16×16、24×24、48×48几种,点阵越大对每个汉字的修饰作用就越强,打印质量也就越高。通常用16×16点阵显示汉字,每一行上的16个点需用两个字节表示,一个16×16点阵的汉字字形码需要2×16=32字节表示,这32字节中的信息是汉字的数字化信息,即汉字字模。下面以“口”为例看看16×16点阵字形是怎样存放的,如图1-8所示。
图1-8 “口”字的16×16点阵字形图
如果把“口”字图形的“.”处用“0”代替,就可以很形象地得到“口”的字形码:0000H 0004H 3FFAH 2004H 2004H 2004H 2004H 2004H 2004H 2004H 2004H 2004H 3FFAH 2004H 0000H 0000H。计算机要输出“口”时,先找到显示字库的首址,根据“口”的机内码经过计算,再去找到“口”的字形码,然后根据字形码(要用二进制)通过字符发生器的控制在屏幕上进行依次扫描,其中二进制代码中是“0”的地方空扫,是“1”的地方扫出亮点,于是就可以得到“口”的字符图形。
字模按构成字模的字体和点阵可分为宋体字模、楷体字模等,这些是基本字模。基本字模经过放大、缩小、反向、旋转等交换可以得到美术字体,如长体、扁体、粗体、细体等。汉字还可以分为简体和繁体两种,ASCII字符也可分为半角字符和全角字符。汉字字模按国标码的顺序排列,以二进制文件形式存放在存储器中,构成汉字字模字库,亦称为汉字字形库,称汉字库。
点阵字体的优点是显示速度快,不像矢量字体需要计算;其最大的缺点是不能放大,一旦放大后会使字形失真,从而文字边缘出现马赛克式的锯齿形状。
4.Unicode编码
Unicode 字符集编码是通用多八位编码字符集(Universal Multiple-Octet Coded Character Set)的简称,支持世界上超过650种语言的国际字符集。Unicode 允许在同一服务器上混合使用不同语言组的不同语言。它是由一个名为 Unicode学术学会(Unicode Consortium)的机构制定的字符编码系统,支持现今世界各种不同语言的书面文本的交换、处理及显示。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
Unicode标准始终使用十六进制数字,而且在书写时在前面加上前缀“U+”。例如,字母A的编码为004116,所以A的编码书写为“U+0041”。
UTF-8是Unicode的其中一个使用方式。UTF-8便于不同的计算机之间使用网络传输不同语言和编码的文字,使得双字节的Unicode能够在现存的处理单字节的系统上正确传输。UTF-8使用可变长度字节来存储Unicode字符。例如,ASCII字母继续使用1字节存储,重音文字、希腊字母或西里尔字母等使用2字节存储,而常用的汉字就要使用3字节存储,辅助平面字符则使用4字节存储。
UTF-32、UTF-16和UTF-8是Unicode标准的编码字符集的字符编码方案,UTF-16使用一个或两个未分配的16位代码单元的序列对Unicode代码点进行编码;UTF-32即将每一个Unicode代码点表示为相同值的32位整数。