1.2.4 常见的信息编码
“数”不仅仅用来表示“量”,它还能作为“码”(Code)来使用。例如,每一个学生入学后都会有一个学号,这就是一种编码,编码的目的之一是为了便于标记每一个学生。又如,在键盘上输入英文字母B,存入计算机的是B的编码01000010,它已不再代表数量值,而是一个字符信息。这里介绍最常用的几种计算机编码。
1.BCD码
人们习惯于使用十进制数,但是在计算机内部都是采用二进制数来表示和处理数据的,因此计算机在输入和输出数据时,都要进行数制之间的转换处理,这项工作如果由人来完成,会浪费大量的时间。因此,必须采用一种编码方法,由计算机自动完成这种识别和转换工作。
所谓BCD(Binary-Coded Decimal)编码,指的是二进制编码形式的十进制数,即把十进制数的每一位分别写成二进制形式的编码。
BCD编码的形式有很多种,通常所采用的是8421编码。这种编码方法是用4位二进制数表示一位十进制数,自左向右每一位所对应的权分别是8、4、2、1。4位二进制数有0000~1111共16种组合形式,但只取前面0000~1001的10种组合形式,分别对应十进制数的0~9,其余6种组合形式在这种编码中没有意义。
BCD编码方法较为简单、自然、容易理解,且书写方便、直观、易于识别。
2.ASCII码
计算机在不同程序之间、在不同的计算机系统之间需要进行数据交换。数据交换的基本要求就是交换的双方必须使用相同的数据格式,即需要统一的编码。
目前计算机中使用最广泛的西文字符集及其编码是ASCII码(American Standard Code for Information Interchange,美国标准信息交换码),它最初是美国国家标准学会(ANSI)制定的,后被国际标准化组织(ISO)确定为国际标准,称为ISO646标准。ASCII码适用于所有拉丁文字字母。ASCII码有两个版本,即标准ASCII码和扩展的ASCII码。
标准ASCII码是7位码(b6~b0),即用7位二进制数来编码,用一个字节存储或表示,其最高位(b7)总是0。7位二进制数总共可编出27=128个码,表示128个字符。
扩展的ASCII码是8位码(b7~b0),即用8位二进制数来编码,用一个字节存储表示。8位二进制数总共可编出28=256个码,它的前128个码与标准的ASCII码相同,后128个码表示一些花纹图案符号。
3.汉字编码
汉字信息在计算机内部处理时要被转化为二进制代码,这就需要对汉字进行编码。相对于ASCII码,汉字编码有许多困难,如汉字量大,字形复杂,存在大量一音多字和一字多音的现象。
汉字编码技术首先要解决的是汉字输入、输出以及在计算机内部的编码问题,不同的处理过程使用不同的处理技术,有不同的编码形式。
(1)输入码
汉字输入码又称“外码”,是为了将汉字通过键盘输入计算机而设计的代码,其表现形式多为字母、数字和符号。输入码与输入法有关。不同的输入法得到输入码的方法不同。代表性的输入法有拼音输入法、五笔字型输入法、自然码输入法等。
(2)交换码
汉字交换码是汉字信息处理系统之间或通信系统之间传输信息时,对每一个汉字所规定的统一编码。汉字交换码的国家标准是GB 2312—1980,又称“国标码”。“国标码”收录包括简化汉字6763个和非汉字图形字符682个(包括中外文字母、数字和符号),该编码表分为94行、94列。每一行称为一个“区”,每一列称为一个“位”。这样,就组成了94个区(01~94),每个区内有94个位(01~94)的汉字字符集。每个汉字由它的区码和位码组合形成“区位码”,作为唯一确定一个汉字或汉字符号的代码。例如,汉字“东”的区位码为2211(即在22区的第11位)。
(3)机内码
汉字的机内码是供计算机系统内部进行存储、加工处理、传输使用的汉字编码,它是国标交换码在机器内部的表示,是在区位码的基础上演变而来的。由于区码和位码的范围都在01~94内,如果直接采用它作为机内码,就会与ASCII码发生冲突,因此对汉字的机内码进行了变换,变换规则如下:
高位内码=区码+20H+80H
低位内码=位码+20H+80H
汉字机内码、国标码和区位码三者之间的关系为:区位码(十进制)的两个字节分别转换为十六进制后加20H得到对应的国标码;国标码的两个字节的最高位分别加1,即汉字交换码(国标码)的两个字节分别加80H得到对应的机内码。
例如,汉字“啊”的区位码(1601)转换成机内码为B0A1H。
(4)字形码
①矢量字体。矢量字体(Vector Font)中每一个字形是通过数学曲线来描述的,它包含了字形边界上的关键点、连线的导数信息等,字体的渲染引擎通过读取这些数学矢量,然后进行一定的数学运算来进行渲染。这类字体的优点是字体实际尺寸可以任意缩放而不变形、变色。矢量字体主要包括Type1、TrueType、OpenType等几类。
矢量字库保存的是对每一个汉字的描述信息,如一个笔画的起始、终止坐标,半径、弧度等。在显示、打印这一类字库时,要经过一系列的数学运算才能输出结果,但是这一类字库保存的汉字理论上可以被无限地放大,笔画轮廓仍然能保持圆滑,打印时使用的字库均为此类字库。Windows使用的字库有点阵字体和矢量字体两类,在Windows操作系统安装分区根目录下的Fonts文件中,如果字体扩展名为FON,表示该文件为点阵字体文件,扩展名为TTF则表示为矢量字体文件。
②点阵字体。汉字字形码是汉字字库中存储的汉字字形的数据化信息,目前汉字信息处理系统中大多数是以点阵的方式形成汉字。输出汉字时,必须将汉字的机内码转换成以点阵形式表示的字形码。通常汉字的点阵有16×16、24×24、32×32、48×48、64×64、96×96、128×128等。例如,如果一个汉字是由16×16个点阵组成的,则一个汉字占16行,每行上有16个点,通常每一个点用一个二进制的位来表示,值“0”表示暗,值“1”表示亮。因此,一个16×16的点阵字库,存储每个汉字的字形信息需要16×16个二进制位,共32字节。显然点阵密度越大,汉字输出的质量也就越好。
点阵字体的优点是显示速度快,不像矢量字体需要计算;其最大的缺点是不能放大,一旦放大后会使字形失真,从而文字边缘出现马赛克式的锯齿形状。
4.Unicode编码
Unicode字符集编码是通用多八位编码字符集(Universal Multiple-Octet Coded Character Set)的简称,支持世界上超过650种语言的国际字符集。Unicode允许在同一服务器上混合使用不同语言组的不同语言。它是由一个名为Unicode学术学会(Unicode Consortium)的机构制定的字符编码系统,支持现今世界各种不同语言的书面文本的交换、处理及显示。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
Unicode标准始终使用十六进制数字,而且书写时在前面加上前缀“U+”。例如,字母A的编码为004116,所以A的编码书写为“U+004116”。
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位整数。