打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
数制和编码知识50问
(网易博客http://xalq329.blog.163.com   李谦  2008-03-16)
说明:这是本人学习电脑的笔记。问题都是我提出来的,答案则完全来自网上。因为提供资料者众多,不便一一致谢,很是抱歉。
为什么写成问答的形式?因为年纪大了,有些健忘,写成问答形式,便于以后查阅。此外,为了加深记忆,对每一个问题的答案都是根据自己的理解,用自己的语言进行了改写,甚至每一个插图或图表都是经过我重新绘制的,绝不照抄照搬,有的地方甚至还有小小的“发挥”。正因为这样,这些问题的答案肯定有不严密甚至错误的地方。本来这是我自己的学习笔记,我在网上看到同是“菜鸟”网友求知欲很强,我就斗胆地把它发布在我的博客上,以便与这些网友交流,当然,更欢迎“大侠”们指正。
本博客似乎不支持把Word文档直接粘贴上传,所以在本问答中的图片都是一个个插入的,很麻烦。如果有的网友希望能看到原文,请给我的信箱发信,我会用PDF格式把本文传给你。
目    录
一. 数制知识·…………………··············· 3
1. 什么是数制?常用的数制有哪些?············· 3
2. 什么是基数?怎样用基数或符号区分不同数制的数?····· 3
3. 什么是位权?如何用位权展开不同数制的数?········ 4
4. 什么是二进制数?如何运算?··············· 4
5. 二进制数如何换算成其他数制的数?············ 5
6. 什么是八进制数?怎样计算? ………………………………………6
7. 八进制数如何换算成其他数制的数?············ 6
8. 什么是十六进制数?如何运算?·············· 7
9. 十六进制数如何换算成其他数制的数?··········· 7
10. 十进制数如何换算为其他数制的数?············ 8
二. 编码的基本知识 ············· ………………11
11. 什么是编码?什么是字符集?·············· 11
12. 计算机常用的国际通用编码有哪些?··········· 11
13. 什么是Unicode码?·················· 12
14. 什么是UCS-2码?什么是UTF-8码?············ 12
15. UCS-2码和UTF-8是怎样转换的?············ 12
16. 什么是codepage?··················· 13
17. 什么是EBCDIC码?··················· 13
18. 什么是BCD码?···················· 13
19. 我国已经颁布的有关编码标准有哪些?·········· 14
20. 什么是“位”?什么是“字节”?············ 15
21. 1个千字节KB是多少字节?··············· 15
22. 什么是“字”?什么是字长?·············· 16
23. 什么是ASCI I码?··················· 16
24. 如何用键盘输入ASCI I字符?·············· 17
25. 请介绍ASCI I码前32个码的含义!············ 18
26. 什么是扩展ASCI I码?················· 18
27. 怎样查找出任一字符的Unicode码?··········· 19
28. 如何把Unicode码转换为相应的字符?·········· 21
29. Unicode码和ASCII码是什么关系?··········· 21
三. 汉字编码知识····………………·········· 22
30. 请介绍计算机对汉字信息的处理过程?·········· 22
31. 请介绍处理汉字信息的要点?·············· 22
32, 什么是汉字的输入码?················· 23
33. 什么是汉字的区位码?················· 23
34. 怎样用区位码输入法输入汉字和字符?·········· 24
35. 请给出区位码表!··················· 24
36. 什么是汉字的交换码?················· 24
37. 什么是汉字的国标码?················· 25
38. 什么是汉字的内码?·················· 25
39. 什么是汉字的处理码?················· 25
40. 区位码、交换码和内码各有什么用途?·········· 25
41. 区位码、交换码和内码之间怎样换算?·········· 26
42. Unicode码和国标码有什么关系? ············ 27
43. 汉字字符是怎样输出的?················ 27
44. 什么是汉字字形码?有几种?·············· 28
45. 什么是点阵字形码?·················· 28
46. 什么是矢量字形码?·················· 29
47. 什么是轮廓字形码?·················· 29
48. 什么是汉字地址码··················· 29
49. 什么是硬字库?什么是软字库?············· 29
50. 小测验题······················· 29
附录:汉字的区位码表 (已删) ···········……… 30
《数制和编码知识50问》正文
一. 数制知识
1. 什么是数制?常用的数制有哪些?
2. 什么是基数?怎样用基数或符号区分不同数制的数?
答:基数(Radix)是一个计数制所包含的数字符号的个数。如果用R表示基数,则十进制(Decimal)的基数是10或R =10,因为十进制数可用的数字符号有:0、1、2、3、4、5、6、7、8、9,共有10个。二进制(Binary)的基数是2或R = 2,因为二进制数可用的数码只有0和1,计两个。同理,八进制(Octal)的基数是8;十六进制(Hexadecimal)的基数是16。
为了区分不同数制的数,约定对于任一R进制的数N,记作:(N)R。比如数字(1010)2、(703)8、(AE05)16 分别表示二进制数1010、八进制数703和十六进制数AE05。
不加括号及下标的数,默认为十进制数,如256。人们也习惯在一个数的后面加上字母D(十进制)、B(二进制)、O(八进制)、H(十六进制)来表示其前面的数用的是什么进位制,如256D表示是十进制数256;1010B表示二进制数1010;AE05H表示十六进制数AE05。
当表示十六进制数时,也经常在数码的前面加以“&H”,例如。“&H20AE”表示这个数是十六进制的20AE。在C语言和另外一些场合,也在十六进制的数码前面加以“ox”,例如“ox4AD”表示这个数是十六进制数4AD。
在表格中或其他场合(如在BIOS中)也经常用“D”或“Dec”来表示十进制数;用“B”或“Bin”来表示二进制数;用“Hx”或“Hex”表示十六进制数。
3. 什么是位权?如何用位权展开不同数制的数?
答:任何一个R进制的数都是由一串数码表示的,其中每一位数码所表示的实际值大小,除数字本身的数值外,还与它所处的位置有关。该位置上的基准值就称为位权(或称位值)。位权用基数R的i次幂表示。对于R进制数,小数点前第一位的位权为R0,小数点前第二位的位权为R1,小数点后第1位的位权为R-1,小数点后第2位的位权为R-2,依此类推。
以下是几个实例:
表2 几种数制的的位权
4. 什么是二进制数?如何运算?
答:二进制数的基数为2,即“逢二进一”。它含有两个数字符号:0、1。位权为2i。
二进制数是计算机中采用的数制,因为计算机正是利用1和0这两个数来表示电子元件的两个稳定状态“开”和“关”的。二进制数的特点是运算规则简单,适合逻辑运算。
二进制的计算规则非常简单。以加法为例,二进制加法规则仅有四条,即
⑴ 加法:0+0=0;1+0=1;0+1=1;1+1=10(逢二进一)。如11+101=1000。
⑵ 减法: 0-0=0  1-0=1  10-1=1(有借位)
⑶ 乘法: 0×0=0  1×0=0  0×1=0  1×1=1
⑷ 除法   0÷1=0  1÷1=1  0÷0=0  1÷0=0(无意义)
但是,二进制的明显缺点是数字冗长、书写量过大,容易出错、不便阅读。所以,在计算机技术文献的书写中,常用八进制、十进制或十六进制数表示。
5. 二进制数如何换算成其他数制的数?
答:不同数制之间的数值转换时,用计算机自带的计算器计算是很方便的。计算方法见第27题。以下只介绍用手工换算的方法。
把二进制数换算成十进制数时,用位权展开的方法;换算成八进或十六进制数时,以二进制数以小数点为界,按三位(改成八进位时)或四位(改成十六进位制时)为一组分段的方法。具体方法如下:
⑴ 二进制数换算成十进制数时,介绍两种方法
第一种方法—用按位权求和的方法。例如,当把二进制数10101110.11换算为十进制的数时,其解见下表:
表3 二进制数转换为十进制计算表
即有(10101110.11)2=174.75或10101110.11B=174.75D
其中的下标“2”表示这是一个二进制数;后面的“B”也表示二进制数;“D”则表示这是十进制数,通常也可以把这个“D”省略。
小数点以后的位权见下表。
表4 小数点后的位权关系
第二种方法—逐步累加法。利用“本位累计数=上位累计数×2+本位数(1或0)”的思路进行累加计算,不必考虑位权。例如,当把二进制数1101101换算成十进制数时,可以利用下述的简单计算就可以得出结果。
⑵ 二进制数换算为八进制数时,可以以小数点为界,把二进制数按三位分为一组的方法进行计算:
例如: (10101110.11)2=(010 101 110.110)2=(256.6)8
或         (10101110.11)B =(256.6)D
这里,以小数点为界,按三个二进制数数为一组划分时,若小数点前的高位是“10”,应该在前面加个“0”,写为“010”;在小数点后的“11”,不足三位,应该在后面加“0”,即把“.11”改写为“.110”。这是应该特别注意的。
⑶二进制数换算为十六进制数时,可以以小数点为界,把二进制数按四位分为一组的方法进行计算:
例如:(10101110.11)2=(1010 1110.1100)2=(AE.C)16
或表示为     (10101110.11)B = (AE.C)H
这里,以小数点为界,按四个二进制数为一组划分时,小数点前的高位不足四位时,应该在前面加“0”以补足四位;如果在小数点后的位数不足四位时,应该在数字的后面加“0”以补足四位。这是应该特别注意的。
另外,用计算器计算时,要把小数点前后的数分别进行计算。
6. 什么是八进制数?怎样计算?
答:八进位制数有0、1、2、3、4、5、6和7共8个数码元素,基数为8,计算时是“逢八进一”。
还可以表示为(365.7)O = (245.875)D
八进位制的加法是“逢八进一,余数留下”;减法的规则是向上一位借一个顶八个。具体操作方法,可参照十六进制的介绍。
7. 八进制数如何换算成其他数制的数?
答:把八进制数换算成十进制数时,用位权展开的方法;换算成二进位时,是把八进制数直接展开成二进制数的方法;换算为十六进制数时,是把八进制数按二进制数展开后,再以小数点为界,按四位一组的方法分组,然后改用十六制数表示即可。具体方法如下:
⑴ 八进制换算成二进制数的方法:用一拆三的方法,即把每一个八进位数都转换为三位二进制数表示。
例:将八进制数604.05转换成二进制数时,结果为:
(604.05)8=(110  000  100.000  101)2
或          (604.05)O = (110 000 100.000 101)B
⑵ 八进制数换算为十进制数的方法:用计算位权的方法。例如,当将八进制数的345.6换算成十进制的数时,结果为:
或表示为       (345.6)O = (229.75)D
⑶ 八进制数换算为十六进制数的方法:首先把八进制数换算为二进制数,再换算为十六进制数。例如,将八进制数5237.6换算为十六进制数时,可以这样计算:
或表示为 (5237.6)O = A9F.CH = oxA9F.C=&HA9F.C
8. 什么是十六进制数?如何运算?
答:十六进制数的基数R为16,即“逢十六进一”。它含有16个数字符号:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。其中A、B、C、D、E,F分别表示十进制数10、11、12、13、14、15。位权为16i。
⑴ 十六进制加减法:当十六进制数相加时,若某一位上的数码之和S小于16时,与十进制加法相同;加法运算时是满16进一,余数留下;减法时是借上一位是16,余数留下。具体方法如下;
⑵ 十六进制数的乘法可以用十进制数的乘法规则来计算,但结果必须用十六进制数来表示。
⑶ 十六进制数的除法可以根据其乘法和减法规则处理。
9.十六进制数如何换算成其他数制的数?
答:把十六进制数换算成十进制数时,用位权展开的方法;换算成二进制数时,是把十六进位数直接用二进位制数展开的方法。如果是转换为八进制数,再把这个二进制数以小数点为界,以三位为一组划分开,然后再转换为八进制的方法。具体方法如下:
⑴ 十六进制换算成二进制数的方法:用“以小数点为界,一拆四”的方法,即把每一个十六进位数都转换为四位二进制数表示。
例:将十六进制数6F.C转换成二进制数时,结果为:
(A6F.C)16 = (1010 0110 1111 .1100)2
或表示为         (A6F.C)H = (101001101111.1100)B
⑵ 十六进制数换算为十进制数的方法:用计算位权的方法。例如,当将十六进制数的A6F.C换算成十进制的数时,结果为:
其实,当把十六进制整数转换为十进制整数时,也可以用逐步累加的方法。思路是:本位的累加数等于上位累加数乘16,再加上本位数。对上题整数部分的计算过程如下:
     即(A6F)H=2671D 。
⑶ 十六进制数换算为八进制数的方法:首先把十六进制数换算为四位二进制数,再以小数点为界,按三位为一组重新组合后,再换算为八进制数。例如,将十六进制数A9F.6换算为八进制数时,可以这样计算:
最后这个表达式说明:表示十六进制数时,至少有4种表示方法;而表示八进制数时,至少有两种方法。
10. 十进制数如何换算为其他数制的数?
答:十进制数换算为二进制、八进或十六进制时,对于整数和分数应该用不同的方法进行转换。介绍如下:
⑴ 十进制整数转换为其他数制整数的方法:设其他数制的基数是R,则当把十进制整数转换为R进制整数时,是采用“除R取余”法。具体步骤是:把十进制整数除以R,得一商数和一余数;再将所得的商除以R,又得到一个新的商数和余数;这样不断地用R去除所得的商数,直到商数为零,即余数小于R为止。
转换结果是这样表示的:把各次所得的余数按逆序排列起来就是所求的结果了。可简记为“除R取余;逆向排序”
例1. 将十进制整数375转换成二进制整数。
解:按“除2取余”法计算时,运算过程见左面的图示。
右面是用减法计算时的步骤,对二进制位权比较熟悉时,用这个方法也是可以的。要求根据被减数的大小适当选择减数,这个减数应该是位权的值,用过的位权位是“1”;没有用过的是“0”。
如果你感到用上述连除的方法不方便,也可以用分散除法来计算。见下面的计算步骤:
例2. 把十进制整数684转换为八进制数。
解:按“除八取余”法的计算过程如下:
应提请注意的是:在数字684   后面的是英文字母o,不是阿拉伯数字零。
例3. 把十进制数2671转换为十六进制数
解:方法是:将十进制数除以16,商是166,余数为15;把商166再除以16,其商是10,余数6。因为商是10,已经小于16了,不能再除了。因此,应该把这个10当作十六进制数的首位,再按逆顺序取余数6和15,合起来得”A6F”,即有2671D = A6FH ,下式就是计算过程。
(2)十进制小数转换为其他数制小数的方法
把十进制小数转换为基数为R的小数时,其方法是:用基数乘以十进制小数,取出乘积中的整数(对二进制数是0 或 1;对八进制数是0~7;对十六进制数为0~F)后,继续用R乘剩下的小数,再次取出整数……。如此反复,直至剩下的小数为零或者取够所需的位数为止。计算结果是:把取出来的整数按正顺序排列在小数点后就行了。具体步骤见下述各例题。
例1. 将十进制小数0.75和0.67转换成二进制小数。
解:其结果是0.75D=0.11B;0.67D = 101010B。详见下面的计算步骤。
例2 将十进制数0.75和0.63转换为八进制数
解:结果是0.75D = 0.60O;0.63D = 0.5024O。计算过程如下:
例3 把十进制小数0.75和0.67换算为十六进位制小数
解:0.75D =0.CH ;0.67D =0.AB8H ,运算步骤如下:
如果你感到用连乘法不方便,或者觉得转换后的有效位数太少,也可以用分散乘法计算。步骤如下:
二. 编码的基本知识
11. 什么是编码?什么是字符集?
答:计算机的芯片(包括CPU和内存条等)是逻辑电子器件,是由亿万个晶体管组成的大规模集成电路,这些晶体管在高电位时接通;低电位时断开。人们正是利用晶体管的这种开关特性进行信息交流,并制成了计算机。因为在通讯技术领域和在电脑技术中,是把接通定为“1”;把断开定为“0”的。所以,如果电路连续接通两次,就是两个“1”,即“11”;如果接通两次后中间断了一次,而后又接通了,这就是“1101”。如果通讯的双方共同商议好:什么样的数字代表什么意思或代表什么符号,只要由一方发出一组用“1”和“0”组成的数码时,对方就知道是什么意思或什么符号了。这就是编码(Coding)的基本概念。
在计算机中,数字、符号、图形、语音等信息都是用“1”和“0”这两个最基本的状态符号来表达、存储和传输的,因为计算机只认识机器语言,即由“0”和“1”码组成的语言。
用“0”和“1”这两个状态符号做出不同的组合,以表示不同的字符(Character),这就是编码。例如,在ASCI I编码中,用“1000001”这种组合表示大写字母“A”; 用“0110001”这种组合表示数字“1”。把各种状态符号的组合对应的字符汇编起来,就是字符集或符号集。当然如果用二进制数表示编码,就太麻烦了,因此,编码大都用十进制数或16进制数表示。
12. 计算机常用的国际通用编码有哪些?
答:目前最通用的是ASCII码,它是用来表示英文字符的一种编码规范,是在信息领域中的一种国际通用的编码。我国也不例外。
ASCI I码是单字节编码,每个字节由7位二进制数组成,最高位(b7)为“0”。因此,编码范围是0~127,即有128个字位。人们把这种编码称为基本ASCI I码或标准ASCI I码。详细情况可参见有管ASCI I编码的问答。
由于基本ASCI I码的范围有限,各个国家和地区为了适应自己的需要,大都在ASCI I码的基础上编制了自己的编码,很不统一。为此,国际上诞生了Unicode码。
Unicode码是国际上几个大的电脑硬件和软件制造商联合制定的一种编码,其版本已经是unicode 5.0或以上了。另外,国际标准化组织(ISO)和国际电工委员会(IEC)也有相应编码标准,名称是“通用多八位编码字符集”,编号是ISO/IEC 10646,目前已经是ISO/IEC 10646:2003或以上了。这些组织制定的相应编码方法都是相同的,也是国际上通用的。不过,人们都叫它为Unicode码,也称UCS(Universal character Set)码或ISO/IEC 10646通用字符集。
我国的GB1300标准与ISO/IEC 10646相对应,即我国等同采用ISO/IEC 10646标准。
这种编码有两种格式:UCS-2和UCS-4。顾名思义,UCS-2就是用两个字节编码,UCS-4就是用4个字节编码。不过,目前实际使用的是UCS-2。这种编码的每个字符是由16位二进制数表示的。所以,理论上说,它可以有2^16=65536个码位。基本上可以涵盖世界上所有的语言和字符,当然也包括中文字符。
在计算机中的“字符映射表”就是Unicode的字符集。这种编码有汉字20902个,编码范围是4E00~9FFF。但是,Unicode码和我国的标准GB2312并不兼容。例如,“谦”字的区位码是十进制数3911;而Unicode码是十进制数35878。
13. 什么是Unicode码?
答:见上一问。
14. 什么是UCS-2码?什么是UTF-8码?
答:UCS只是一个字符集,如果直接用它进行传输和处理时就遇到以下问题:因为用一个字节表示的ASCII码早已广泛应用,UCS-2码又在标准ASCII码的基础上另外增加一个全部为零的字节,使本来是一个字节的编码变成了两个字节,徒添麻烦,人们感到不方便。更重要的是:在C语言和很多类Unix系统里面,一个字节的ASCI I码往往有控制作用,可以做转意字符,在文件或库函数里有特殊的作用,而两字节的Unicode码则无法应用。此外,不同的系统平台的设计理念不同,对编码的要求也不完全一致。例如,同是一个Unicode编码U+4E59,苹果机可能认为是“奎”字;PC机则认为是“乙”字。为了解决这些问题,UTF出现了。
UTF(UCS Transformation Format)是UCS 转换格式的意思,怎样转换呢?有许多方法,例如:UTF-8、UTF-16小尾序(Unicode)、UTF-16大尾序(Unicode big-enddian)、UTF-32、UTF-7等等。
最常用的方法之一是UTF-8码转换法,这种方法这是一种变长编码,它将基本ASCII字符仍用7位编码表示,占用一个字节(首位补0)。而遇到与其他 Unicode 字符混合的情况,将按一定算法转换,每个字符使用1-3个字节编码,并利用首位为0或1进行识别。这样对以7位ASCII字符为主的西文文档就大大节省了编码长度。它既保留了Unicode的优势,又能够与ASCII兼容。
15. UCS-2码和UTF-8是怎样转换的?
答: UCS-2是一个双字节的Unicode字符集,但是,在使用中存在以上问题。因此,出现了UTF-8,UTF-8的编码字节数则是可变的,理论上说它可以用1~6个字节表示,这就解决了以上的难题。怎么变呢?
对基本ASCII码来说, UTF-8用一个字节来表示,即它和基本ASCII码兼容;对位于0080H~07FFH范围内的UCS-2编码,用两个字节表示;对于汉字来说(在UCS-2中,它在0800H~FFFFH范围内),UTF-8用三个字节表示。在下表中列出了Unicode编码范围和与之对应的UTF-8编码模板。只列出了1~3个字节的情况。当进行转换时,其中的红色数字是必须保留的,打“×”的二进制数是由UCS-2编码依序移置过来的:
表5 UCS-2转换为UTF-8的模板
UCS-2的编码范围
UTF-8表示方法
0000H~007FH
0×××××××
0080H~07FFH
110×××××× 10××××××
0800H~FFFFH
1110×××× 10×××××× 10××××××
例 1:已知“A”字的ASCII码是41H,求用UTF-8表示的“A”字的编码。
解:数41H是处于0000H~007FH的范围内的数,所以,应该用一个字节表示。因为16进制数41H用二进制数表示时是01000001,套用上表的模板,用UTF-8表示时,UTF-8的编码也是01000001。
例 2:已知中文“汉”字的UCS-2编码是6C49。求UTF-8对“汉”字的编码。
解;6C49在0800-FFFF之间,所以,从上表可知,在UTF-8中,“汉”字肯定要用3字节的模板表示。因为将6C49写成二进制时是:0110 110001 001001,套用上表的模板,“汉”字的UTF-8的编码就是11100110 10110001 10001001,即为E6  B1  89。
16. 什么是codepage?
答:codepage就是各国的文字编码和Unicode之间的映射表。因为编码在世界范围内都统一了,但是,各个国家或地区的编码仍然存在着,为了兼容原先各国的文字编码,必须有此类映射表。简体中文和Unicode的映射表就是CP936。即codepage=936 简体中文GBK。
如汉字的“大”字,其国标码是3473H,在UCS的编码为00005927H,即在00组,00面,59H行,第27H字位上。这个换算关系,在Codepage936 中可以查到。
17. 什么是EBCDIC码?
答:尽管ASCI I码是计算机世界的主要标准,但在许多IBM大型机系统上却没有采用。在IBM
的System/360计算机中,IBM研制了自己的8位字符编码——EBCDIC码(Extended Binary Coded Decimal Interchange Code,扩展的二-十进制交换码)。该编码是对早期的BCDIC 6位编码的扩展,其中一个字符的EBCDIC码占用一个字节,用8位二进制码表示信息,一共可以表示出256 种字符。
18. 什么是BCD码?
答:BCD(Binary Coded Decimal)码是用二进制数表示十进制数的方法,也就是说,它是讨论怎样用一种数制的数来表示另一种数制的数的方法的,因此,经常把BCD码称为代码。但是,也经常称之为编码。而本问答集所讨论的编码是怎样把文字符号用数字编码的问题。因此,这两种编码并不是一回事。也不是本问答集的主题。但是,还是需要介绍一下BCD码。
为什么需要BCD码呢?因为人们在生活中最熟悉的计数制是十进制,而在计算机处理数据时是用二进制的,因此,BCD码的二进制数的形式可以满足数字系统的要求;BCD码的十进制的形式,可以适应人们的计数习惯。
BCD码有8421码、5421码、5211码、2421码和余3码等几种,但是,最常用的是8421码。在下表中列出了几种数制中的个别数跟8421BCD码的对照。
表6  8421BCD码和其他数制的关系
十进制数
二进制数
十六进制数
8421BCD码
0
0000 0000
0
0000 0000
1
0000 0001
1
0000 0001
2
0000 0010
2
0000 0010
9
0000 1001
9
0000 1001
10
0000 1010
10
0001 0000
11
0000 1011
11
0001 0001
19
0001 0011
13
0001 1001
100
0110 0100
64
0001 0000 0000
255
1111 1111
FF
0010 0101 0101
由此表可以看出,8421BCD码跟二进制数在十进制数0~9的范围内是完全对应的。从10以后就不相同了。也就是说BCD码是由“1001”加1后,直接进位为“1 0000”的。之所以出现这种情况,是因为8421BCD码的编码规定造成的。因为BCD码规定用二进制数表示十进制数时,不管十进制数的位权是什么,只要把这个十进制数转换成二进制数就可以了。例如,把十进制数“23.5”直接改写为“0010 0011.0101”就是BCD码了。
这里所说的“8421”实际上就是四位二进制数的权。因为根据8421码的规定,为了表示十进制数中的任意一串数,只用四位二进制数就可以了。四位数可以组合为16种状态,足以表示十进制数的十个数了(如果用三位,只能组合成八种状态,就不够)。因此,四位二进制数的最后六个数不被采用,称它们是8421BCD码中非法的数。这六个非法数是1010,1011,1100,1101,1110,1111。
例1:写出十进制数19的BCD码。
解:由上表知19D=(0001 1001)BCD
例2:写出十进制数489.15的8421BCD码。
解:(489.15)10=(0100 1000 1001.0001 0101)BCD
例3:将(0001 1011.0010 0101)BCD码转换为等值的二进制数。
解:不能求解,因为“1011”在8421BCD码中是非法的。
例4:将二进制数01000111转换为BCD码。
解:(01000111)B = (71)D=(0111 0001)BCD
19. 我国已经颁布的有关编码标准有哪些?
答:目前,汉字字符集有如下几种:
⑴ GB 2312-80汉字编码:GB2312码全称《信息交换用汉字编码集——基本集》,标准号为GB2312-80,是中国国家标准汉字信息交换用编码,习惯上称国标码,新加坡也使用这一编码。共有7445个图形字符。其中汉字6763个,汉字以外的图形字符682个。详见有关区位码、国标码的问答。
⑵ GBK编码(Chinese Internal Specification): GBK(是“国家标准扩展”的意思)全称《汉字内码扩展规范》,是全国信息技术标准化技术委员会1995年12月1日制订的。
GBK向下与GB2312-80编码兼容,向上支持ISO10646.1国际标准。共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。IBM等大公司都支持这个标准。
⑶ CJK编码:是包含在ISO/IEC 10646标准的一部分。其中包含了中、日、韩统一的象形文字27484个。简称CJK字符,即中日韩三国的字符编码集。
⑷ GB18030-2000编码: GB18030-2000编码标准是在原GB2312-80编码标准基础上扩展而成的。采用单字节、 双字节和四字节三种方式编码,编码空间达160多万个。基本平面的汉字数达27533个。同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。
GB18030-2000支持全部CJK统一汉字字符,也解决了内陆使用GB码与港台地区使用BIG-5码间转换不便的状况。GB18030-2000的修订版GB18030-2005又有所扩展,有70244个汉字。
⑸ GB 12345—90《信息交换用汉字编码字符集第一辅助集》:该标准共收录了6866个汉字,纯繁体字有2200多个。主要是为古籍整理用的。
⑹ BIG-5: BIG-5码是通行于台湾、香港地区的一个繁体字编码方案,俗称“大五码”。
20. 什么是“位”?什么是“字节”?
答:二进制数是由“1”和“0”组成的,也就是说,二进制数中0和1是构成二进制数的最小单位,也是计算机传递信息的最小单位,我们把这个最小单位称为位(bit),也称比特,符号为b 。每个位不是“1”就是“0”,或者说“1”占一个位;“0”也占一个位。各个位的名称、位权和相当的十进制数见下表。
表7  二进制数的位和位权
在计算机中,每8个位组成一个字节,例如上表的二进制数有8位,就构成了一个字节(Byte),字节的符号是B。一个英文符号一般用一个字节表示;一个汉字至少要用两个字节表示。字节是存储器中保存数据的最小单位。
21. 1个千字节KB是多少字节?
答:由于计算机使用二进制数,2的10次幂(等于十进制数的1024)与十进制数的1000近似,所以,在计算机中“千字节”是按二进制数定义的,即有
1KB=2^10 B=1024 B。所以,1MB=2^20B=1048576B=1024KB;同理,1GB=2^30B=1024 MB ;1TB=2^40B=1024GB。
其中KB、MB、GB、TB分别称为“千字节”、“兆字节”、“ 吉字节”和“太字节”,都是千倍关系。但是,在有些场合(如硬盘商)把1KB当作1000B;余依此类推。因此,因为使用方法不同,经常发生名义字节和实测字节不一致的情况发生。
还应该提醒的是:在计量单位的国家标准中,“ k”是词头符号,应该用小写,可是,在计算机中,似乎它和兆(M)平起平坐了,都是大写。
22. 什么是“字”?什么是字长?
答:字(Word)是计算机进行信息交换、处理、存储的基本单元。一条指令或一个数据信息,称为一个字。也就是说,字是指计算机一次并行处理的一组二进制数,它由若干个字节组成。
一个字所包含的位数称为字长(Word Length)。字长不是固定值,跟CPU的型号有关。曾经有过8、16和32位之分,目前主流计算机都是64位的。当我们说计算机是32位时,就是指的是这台计算机的CPU的字长是32位。或者说这台计算机的CPU能在单位时间内处理字长为32位(即4个字节)的二进制数据。
字长实际上是CPU内部总线的位宽。字长与CPU的寄存器数目有关,但是,不能说字长就是寄存器的数目。字长也与CPU内部总线有关,但是,不能说字长就是CPU内部总线数。
23. 什么是ASCII码?
答:ASCI I(American Standard Code for Information Interchange,美国信息互换标准代码),是目前国际上普遍采用的字符系统,它是基于罗马字母表的一套电脑编码系统,它主要用于显示现代英语国家的语言。因为国际标准化组织(ISO)已经把它采用作为国际标准,编号为ISO 646,所以,ASCI I码也是国际通用的编码标准。这个编码还叫基本ASCI I码或标准ASCI I码,以与扩展ASCII码相区别。标准ASCI I码与我国的编码标准是兼容的。
ASCI I码占用一个字节,即8位(参见上表)。但是,只使用其中b0~b6位,共7位,用于编码;最高一位(即b7位)是0,可以作为奇偶校验位。这样一来,可以编码的数目就是128个。编码范围用十进制数表示就是0~127,用二进制数表示为00000000B~ 01111111B。这里,在二进制数的数字后面加上B,表示这是一个二进制数。“二进制”的原文是“Binary”或“Binary System”。 在表格中,经常用“Bin”或“B”来注明这是一个二进制数。
下表就是用十进制数表示的ASCI I码表的符号编码部分。例如“K”字的编码是75,它的二进制编码就是01001011B。在表中的第32个码是空格码;第128个码是欧元的代码,原本不是标准ASCII码。还有0~31和第127号码,共33个,是控制码,是不能显示和打印的。这33个码的含义见下一问。
虽然标准ASCII码是7位编码,但由于计算机处理数据是以字节为最小单位的,所以一般仍以一个字节来存放一个ASCII字符。每一个字节中多余出来的一位(最高位)在计算机内部通常保持为0。在数据传输时可用这一位作奇偶校验位。
表8  ASCII码的字符部分
24. 如何用键盘输入ASCII字符?.
答:目前的计算机大都支持ASCII码,所以,当你按键盘上的“A”字时,计算机接收到的信息就是二进制数码“0100 1001”,但是,它显示给你的却是一个“A”字。
如果你想用按键盘的方法让计算机显示出ASCII码所代表的字符,也是可以的。不过,不能用键盘直接键入二进制数码的方法,因为如果这样做,就太不方便了,何况计算机的设计者也没有这样设计。怎么办呢?
因为Unicode码和基本ASCII码是兼容的,所以,可以利用字符映射表来输入ASCII码的字符。方法是:点击小键盘区的“Num Lock”键使“Num Lock”绿色显示灯亮起来。进入小键盘区后,按住“Alt”键,键入ASCII码的十进制数(例如数字“65”)后,再松开“Alt”键,“A”字就显示出来了。因为,你键入的数码是“65”,但是,计算机收到的信息是“0100 0001”。
ASCII码除了可以用二进制数和十进制数表示以外,还可以用8进制和16进制的数表示。不管用哪个数制,计算机执行的都是二进制码。
25. 请介绍ASCII码前32个控制码的含义!
答:可见下表的说明。
表9  ASCII码的控制码说明
26. 什么是扩展ASCII码?
答:由于标准ASCII字符集字符是7位代码,编码数目最多为128个,在实际应用中往往无法满足要求。为此,国际标准化组织又制定了ISO 2022标准,它规定了在保持与ISO 646兼容的前提下将ASCII字符集扩充为8位代码的统一方法,即将b7位不再作为奇偶检验用,也把它纳入编码范围。ISO陆续制定了一批适用于不同地区的扩充ASCII字符集,每种扩充ASCII字符集分别可以扩充128个字符,这些扩充字符的编码称为扩展ASCII码。在下表中列出了扩展ASCII编码表。在 0128~0255内的编码都属于这个范围。
由于中国的汉字编码的机内码是用两个8位的字节编码,所以,和扩展ASCII码并不兼容;扩展ASCII码与Unicode码也不兼容。例如,对符号“±”来说,扩展ASCII码的十进制数是“241”;Unicode码的十进制数是“0177”;国标码的十进制数则是“0132”。
表10  扩展ASCII码表
27. 怎样查找出任一字符的Unicode码?
答:在Unicode里,所有的字符被一视同仁。汉字不再使用“两个扩展ASCII”,而是使用“1个Unicode码”,所以,现在的汉字是“一个字符”了。
要想查出已知字符的Unicode码,有两个方法,较麻烦的方法是用Win XP的字符映射表查,步骤:
①“开始”→“全部程序”→“附件”→“系统工具”→“字符映射表”→从显示出来的字符映射表中找到你要查的字符(例如“实心星”★),并点击它;
这时在映射表的左下角会出现“U+××××”字样,这就是Unicode码的表示方法:在“U+”后面的4个“×”就是16进制数的Unicode编码(这里是2605)。好了。把这个4 位的16进制数记住,再用计算器算出它的十进制数是什么。可以用手工计算出来,计算方法见前面的问答。比较方便的是用计算机内的计算器计算,若用计算器计算,可见下一步;
② “开始”→“全部程序”→“附件”→“计算器”→进入“科学计算”模式,点击选中“⊙十六进制”(如下图)→在右面的窗格中输入这个16进制数→再点击选中“⊙十进制”→这时在计算器的显示屏中就会显示出十进制数(这时是“9733”),记住它;
图2  计算器
③ 单击小键盘区的“Num Lock”键,进入小键盘区→按住“Alt”键,用小键盘键入十进制数(这时是9733)→把“Alt”键松开,这时就会出现一个实心星号★。
还有一个简单的方法查出字符或文字的16进制数码,方法是:选中这个字符(也可以把鼠标置于它的右边)后,按“Alt+X”键,这时,这个符号就变成了十六进制数了。不过,大前提是在你的屏幕上已经有了这个字符。例如,当你将鼠标的指针放到前面这个“到”字的后面按“Alt+X”键时,这个“到”字就变成“5230”了。当你再按一次“Alt+X”键时,“到”字又回来了。
此外,也可以用关键词“Unicode”或“Unicode编码表”到“百度”或“谷歌”去搜索Unicode编码表。
28. 如何把Unicode编码转换为相应的字符?
答:已经知道某个符号的十六进制编码时,也有两种方法把它转换为字符。第一种方法是把这个十六进制数换算为十进制数后,进入小键盘区,按住“Alt”→键入这个十进制号码后,松开“Alt”键,字符就显示出来了。下表是若干特殊字符的Unicode十进制编码,供参考。
表11  常用字符的Unicode十进制编码摘录
最简单的方法是直接把这个十六进制数输入到Word文档,并用鼠标选中这它,再按“Alt+X”组合键,这个十六制数就变成符号了。不过,在上表中给出的是十进制数(用Dec标明了),要想采用这个方法时,还必须把它转换成16进制才行。例如,不等号≠的十进制数是8800,转换成16进制数时是2260。
29.  Unicode码和ASCII码是什么关系?
答:Unicode码是晚于ASCII码出世的,Unicode是双字节码,ASCII码是单字节码,所以,二者是不兼容的。但是,当把UCS转换为UTF-8表示时,Unicode码是与ASCII则是兼容的。
三. 汉字编码知识
30. 请介绍计算机对汉字信息的处理过程?
答:现代的计算机的键盘都是用西洋文字标注的,所以,对英文字符的输入、存储、内部处理和输出都可以只用同一个编码(如ASCII码),因此相对容易。可是,汉字是一种象形文字,字数极多,同音字也多,如果让计算机也能对汉字信息进行处理,就必须将汉字代码化,即对汉字进行编码,然后才能对汉字信息进行处理。
计算机在处理汉字信息的过程不同,对编码的要求和方法也不同。例如,要想让计算机对汉字进行处理,第一步就是把汉字信息输入到计算机中去,这时需要的是输入码(Chinese  Character input Code );要想让计算机能够对这个汉字信息进行保存和处理,必须把输入码变换成机内码(Chinese  Characters Internal  Code)。输出汉字时,如果是送往终端设备或其他汉字系统,则需要把汉字内码变换成标准汉字交换码(Chinese  Character Exchange   Code)后,再进行传送。如果需要把处理结果显示或打印出来,就需要把机内码变换成字形码(Chinese  Character Font  Code)。也就是要按一定的规则到汉字字形库中取出汉字的字形码,送往显示器或打印机。这个汉字处理过程所用的编码用图形表示如下图:
图3   计算机对汉字的处理过程
31. 请概要介绍处理汉字信息的要点
答:概括地讲,用计算机处理汉字信息时,需要解决的几个问题:
(1) 怎样将汉字输入计算机?(用汉字输入编码,即用外码)
(2) 在计算机内部怎样处理汉字?(用机内码,即内码,也叫处理码)
(3) 在计算机之间怎样交换汉字信息?(用交换码,也称国标码)
(4) 计算机如何实现汉字信息的输出?(用图形码,或点阵方式或矢量方式或轮括方式)。
此外,还应该知道:机内码和交换码是由区位码派生出来的;字形码和内码是一一对应的。不管是什么码,计算机执行的都是二进制码。
32, 什么是汉字的输入码?
答:汉字输入码是为了将汉字通过键盘输入计算机而设计的编码。输入码也称外码。各种输入码有六七百种,但是,归纳为四大类:
⑴ 数字编码(如区位码、电报码等),也称流水码,这种编码方式没有重码,但是,难于记忆和使用;
⑵ 拼音码(如微软拼音、紫光拼音等),优点是记忆方便,使用简单;缺点是重码多,输入慢。适合非专业的计算机使用人员;
⑶ 字形码(如五笔输入法),优点是重码少,速度快;缺点是规则复杂,记忆困难;适合专业人员或对计算机使用频繁的场合;
⑷ 音形码(如智能ABC输入法)。
虽然各种编码方法各不相同,但是,对同一个字符来说,各种编码方法最终得到的汉字的机内码必然是相同的。
33. 什么是汉字的区位码?
答:根据我国的国家标准GB 2312—80规定,所有的国标汉字与符号组成一个94×94的方阵,在此方阵中,每一行称为一个“区” (区号为01~94 ),每一列称为一个“位” (位号为01~94 ),见下图。该方阵实际组成了一个94×94=8836的保存字符的方格(方格未画出),每个小方格就是一个字符位。
图4  区位码的解释
这个方格是用区位码(Zone Bit Code)定位的。区码(Zone Code)按行排;位码(Bit Code)按列排。区码和位码各用两位十进制数字表示。区码和位码简单地组合在一起(即两位区码居高位,两位位码居低位)就形成了“区位码”。例如,“爱”字位于第16区14位,所以,“爱”字的区码是“16”;位码是“14”,合起来的区位码为1614。
汉字在区位码表的排列是有规律的。在94个分区中, 01~15区为图形符号区,其中,01~09区为标准区, 10~15区为自定义符号区。16~55区为一级常用汉字区,共有3755个汉字,该区的汉字按拼音排序。56~87区为二级非常用汉字区,共有3008个汉字,该区的汉字按部首排序。总汉字为6763个。88~94区为用户自定义汉字区。由此可知,汉字编码所占的区位为72×94=6768,其中有5个空位。数字72的由来是 94-15-(94-87)=72。
34. 怎样用区位码输入法输入汉字和字符?
答:在Win XP中有区位码输入法,可以用下述方法把它调出来:右击任务栏系统托盘区的输入法图标→点击“设置”→在“文字服务和输入语言”窗口选择“中文(简体)内码”→“确定”后,区位码输入法就被调出来了。为了便于使用,还可以设定快捷键。
进入区位码输入环境后,在Word文档的主键盘区直接键入区位码就可以显示出相应的字符了。关键是你要事先知道某个符号的区位码。要想知道某个字符的区位码,还需查区位码表,所以用这个方法不是太方便的。
35. 请给出区位码表!
答:因为该表所占字节太多,不便在这里给出。请参见本文的附件《汉字区位码表》。下面给出一些常用符号的编码。
表12  区位码符号摘录
36. 什么是汉字的交换码?
答:汉字交换码(Chines Character Exchange Code)是指具有汉字处理功能的不同的计算机系统之间在交换汉字信息时所使用的代码标准。
为什么当进行信息交换时,必须把区位码转换为交换码呢?这是因为区位码(Zone Bit Code)是无法用于汉字通信的,因为它可能与通信使用的标准ASCII码的控制码(即0D~31D或00000000B ~00011111B)发生冲突。例如,“爱”字的区位码是1614,如果仿照ASCII码的表示方法,用二进制数表示“爱”字时,就是00010000B  00001110B,可见,“爱”字高位字节的“00010000B”(16D)和低字节的“00001110B”(14D)都在ASCII码的控制符区内,从而发生冲突。
因为ASCII码是国际通用编码,我们也需要它,所以,汉字编码必须避开这一个区域,因此,ISO2022规定每个汉字的区号和位号必须分别加上32D(即二进制数00100000B,十六进制为20H),经过这样的处理而得的代码称为国标交换码,简称交换码。把高字节和低字节都加上“0010000B”后,“爱”字的交换码就变成了“00110000B  00101110B”(十进制数分别是48D和46D),从而避免了和标准ASCII码控制符的冲突。
交换码通常是用四位16进制数表示的。因为48D=30H;46D=2EH,所以“爱”字交换码的16进制表示为“302EH”。
37. 什么是汉字的国标码?
答:国标码(National Stadard Code)就是上题所说的交换码。简单地说:国标码就是交换码,它是用两个b7位为“0”的字节表示一个汉字的;高字节=(以16进制表示的)区号+20H ;低字节=(以16进制表示的)位号+20H ,从而避开了跟标准ASCII码中控制码的冲突,以利信息交换。
38. 什么是汉字的内码?
答:汉字的机内码简称“内部码”或“内码”,它是从交换码的基础上演变而来的。因为在中文文本中,汉字与西文字符经常是混合在一起使用的,如果汉字信息不予以特别的标识,它与单字节的标准ASCII码就会混淆不清。例如上面所说的“爱”字的国标码是 “00110000B 00101110B”,它虽然不再跟ASCII码中的控制码相冲突,但是,如果汉字和西文混编时,“ 爱”字的高位码“00110000D”(十进位是48)可能被误认为是数字“0”;低位的“00101110D”(十进位数是46)可能被误认为是英文的句号“.”。
为了避免这种情况发生,把一个汉字看作两个扩展ASCII码,使表示GB2312汉字的两个字节的最高位(b7)都等于“1”,即把交换码的高字节都增加十进制数128(或16进制数80H)。这种高位为l的双字节(16位)汉字编码就称为GB2312汉字的“机内码”,又称内码。这样一来,当程序在运行过程中,只要发现高字节是数字“1”,计算机就知道这是汉字了。
内码通常是以16进制数表示的。计算方法可见下一问。
39. 什么是汉字的处理码?
答:汉字的处理码就是内码,再把上一问概括如下:
内码是以汉字的区位码为基础的,是为了适应汉字和西文混排而产生的。它的编码方法是:
内码=(以16进位制表示的)区位码+A0A0H。
例如,“爱”字的区位码是“1614”,也就是说它的区码是十进制数16;位码是十进制数14。把它们转换为16进制数时分别是“10”和“0E”。这样,以16进制数表示的“爱”字的区位码就是“100E”。当按规定把这个16进制区位码数加上“A0A0H”时,就变成了“B0AEH”,这个数就是“爱”字的内码。这个结果和上题的计算结果是一致的,因为B0AEH=10110000B 101011110B。
40. 归纳一下区位码、交换码和内码的用途吧!
答:简述如下:
⑴ 为了能在计算机上处理汉字,必须把汉字变成二进制数表示,因为计算机只认识二进制数。
⑵ 要想使汉字变成二进制数,首先应该给每个汉字都编一个唯一的号码,区位码就是给每个汉字编的号码。区码(按行排)和位码(按列排)的编码范围都是十进制数的1~94,所以,理论上说,区位码可以给94^2=8836个汉字编码。实际上没有那么多。
区位码用四位十进制数表示,前两位是区码;后两位是位码。如“爱”字的区位码是1614D,用16进制数表示就是100EH。
⑶ 因为区位码是用四位十进制数表示的,为了让计算机也认识,必须把它们转换为二进制数字。我国是用两个标准ASCII码表示一个汉字的。表示区码的称为高字节;表示位码的称位低字节。但是,已经存在的标准ASCII码中的控制码是国际通用码,也是我们需要的,因此,在给汉字编码时,不能占用。这个控制码的范围是从0~31,共32个。为了避开这32个编码,把每个区位码上都加上个数字“32D”(20H),这样就把ASCII码中的32个控制码码绕开了。以十六进制表示的区位码,加上2020H,就称为汉字的交换码。例如,“爱”字的区位码是1614D,用十六进制表示是100EH,把它加上2020H后,有100EH+2020H =302EH,这个302EH就是“爱”字的交换码了。
⑷ 汉字的交换码就可以作为汉字的编码进行汉字的信息交流了。但是,当在实际使用时,往往是汉字和西文字符混排的,为了不致造成计算机的误认,所以,又把交换码高字节和低字节中最高的那位(即b7位)都用“ 1”表示,这样,当程序运行过程中,如果计算机发现二进制码的最高位(b7位)是“1”,它就知道是汉字了。因为西文都是用标准ASCII码编写的,这种编码的最高位(b7位)必是“0”,所以计算机凭这个特点就可以汉字和西文区分开。
上述的把交换码的高字节和低字节都用“1”表示,就相当于给每个字节都加上128D(即80H)。交换码加以8080H后,就变成内码了。例如,“爱”字的交换码是302EH,302EH+8080H=B0AEH。所以,“爱”字的机内码就是B0AEH。
41. 区位码、交换码和内码之间怎样换算?
答:交换码和内码都是由区位码派生的,他们之间的关系是:
交换码=区位码(用16进位制)+2020H
机内码=交换码(用16进位制)+8080H=区位码(用16进位制)+A0A0H
图5  区位码、交换码和内码的互换示意图
应该特别注意的是:因为一个汉字是用两个字节表示的,所以,当把区位码转换为交换码或将交换码转换为机内码时,都要把高字节和低字节分别进行转换。例如,将“爱”字的区位码转换为十六制时,应该是用16D=10H和14D=0E,所以,用十六进制表示时,“爱”字的区位码是“100EH”,绝对不是“1614D=64EH”。
例:“学”字的区位码是“4907D”,求其机内码。
解:区码49D=31H;位码07D=07H,因此,“学”字用16进制数表示时,其区位码是“3107H”。根据上式可得“学”字的交换码是3107H+2020H=5127H;机内码就是5127H+8080H=D1A7H。
这个问题也可以用二进制数运算,但是比较麻烦:
⑴. 因为“学”字的区位码是4907D,而49D=00110001B;07D=00000111B,所以,“学”字的二进制编码是00110001 00000111B。
⑵ 若转换为交换码,需在每个字节上加32D,即加00100000,这时有
把这两个计算结果转换为十六进制就是5127H,即“学”字的交换码是5127H。
如果把交换码再转换为机内码,则应在每个字节上加以80H=10000000B,其计算式是:
把它们转换为十六进制就是D1A7H,即“学”字的机内码是D1A7H。
42. Unicode码和国标码有什么关系?
答:Unicode 码和国标码是不兼容的。例如,“李”字的国标区位码十进制数是“3278”;而Unicode 的十进制编码是“26446”。
43. 汉字字符是怎样输出的?
答:汉字的输入、处理和输出过程,实际上是汉字的各种代码之间的转换过程。下图是这种过程的示意图。由图可知,当将输入码变换成机内码后,还不能作为汉字直接输出,只有变成字形码后才能输出到显示屏或打字机去。
图6  汉字输出过程示意图
汉字字形编码是事先存放在汉字库中的,因为“字库”的容量太大,它通常是保存在硬盘里。汉字库的布局是以汉字国标码的次序前后排列的。所以,在汉字的显示和打印输出过程中,文字处理器根据汉字内码计算出地址码后,按地址码从字库中取出汉字字形码,才能实现汉字的显示或打印输出。
有的汉字打印机,只需送入汉字内码,就可以自行将汉字印出,因为在这种打印机中,汉字内码到字形码的转换是由打印机本身完成的。
44. 什么是汉字字形码?有几种?
答:汉字字形码是表示汉字字形的字模数据,所以,也称字模码。汉字的字形码是为字符的输出而设定的,所以,又称其为输出码。字形码有点阵字形码、矢量函数字形码和轮廓字形码等。
在计算机中都有相应字码的字库。目前在计算机中配备的字库基本上都是轮廓形字库,点阵形字库的字已经很少了。例如Windows的文件库中的字型大都是Ture type fonts(TTF)字形,这种字形就是轮廓字形。在每个字体名称前面注有双”T”的就是,这种汉字既可作屏幕显示,又可以作打印输出。注有红“A”字的是点阵形字体。在FONTS目录下,如果字体扩展名为FON,表示该文件为点阵字库;扩展名为TTF则表示矢量字库。
45. 什么是点阵字形码?
答:因为汉字是方块字,所以,可以将方块等分成有n行n列的格子来描绘它,我们把这些格子称为点阵。设笔画所到的格子点为蓝方点(见下图),用二进制数“1”表示,否则为白点,用二进制数“0”表示。这样,一个汉字的字形就可用一串二进制数表示了(在图中没有列出这个二进制数,因为从图中就可以很容易地读出来。只列出了相应的16进制数)。
用点阵表示字形时,汉字字形码一般指确定汉字字形的这些点阵代码。随着汉字字形点阵和格式的不同,汉字字形码也不同。常用的字形点阵有16×16点阵、24×24点阵、48×48点阵等等。下图就是“你”字的点阵图和用16进制数表示的点阵代码(字模信息)。可以看出,这是一个16×16的点阵图。如果用更高的点阵图,会更清楚些。
图7  汉字点阵代码示意图
字模点阵的信息量是很大的,占用存储空间也很大,以16×16点阵为例,每个汉字占用16×16=256个点阵,即 256bit,因为每8位是一个字节,所以,256bit就是32个字节,也就是说,一个汉字就要占用32个字节。两级汉字计有6763个汉字,如此推算起来,为了存储两级汉字就要占用大约216KB。如果是48×48点阵形式,每个汉字要占用288个字节,所占用的字节大约是1MB。太大了。因此,字模点阵只能用 “字库”来存储在硬盘上,等需要时再把它从字库中取出来,而不能用于机内存储。
46. 什么是矢量字形码?
答:矢量字形码的构成与点阵字形码不同,它们对汉字的处理方法也不同。它是用数学方法,对汉字进行处理,在每个字的外形取一个个参数,用数字方法对这些点进行描述,再把各个点用矢量线连接起来,就是该汉字字形的矢量信息。矢量汉字适当放大之后,也不会失真、变形,精度比点阵字要高,但是当矢量汉字大到一定程度时,也会出现连续的折线,出现棱角,对于专业出版人员来说,效果并不是特别令人满意。
47. 什么是轮廓字形码?
答:曲线轮廓汉字码,是目前水平最高,也最有前途的汉字库。这种字体精度最高,效果最好,多级放大也不会产生毛刺、折线、锯齿,字体最为美观漂亮。Windows、中文之星等使用的汉字,都是这种曲线轮廓汉字。
曲线轮廓汉字用贝齐尔二次曲线、三次曲线来描述汉字,精密特别高,不管设备如何,分辨率如何,这种字体都能够高质量地进行输出。True Type汉字吸收了曲线轮廓字形技术的优点,是一种高水平的曲线轮廓汉字,有“真正打印汉字”之称,缺点是输出之前必须经过复杂的数学运算处理。
48. 什么是汉字地址码
答:汉字地址码是指汉字库(这里主要指整字形的点阵式字模库)中存储汉字字形信息的逻辑地址码。汉字库中,字形信息都是按一定顺序(大多数按标准汉字交换码中汉字的排列顺序)连续存放在存储介质上,所以汉字地址码也大多是连续有序的,而且与汉字内码间有着简单的对应关系,这样就可以简化汉字内码到汉字地址码的转换。
49. 什么是硬字库?什么是软字库?
答:保存在硬盘或软盘中的字库称为软字库。将字库固化在ROM中,称硬字库,也称汉卡,但是,汉卡很少使用。
50. 小测验题
⑴ 1KB等于多少个字节? (答:1024 B)
⑵ 四位二进制数最多能表示多少个数?(答:0~15,计16个)
⑶ 11011B换算成十进制数是多少?(手算)(答:27D)
⑷ 18D换算成二进制数是多少?(手算)(答:10010B)
⑸ 0.48D换算成十六进制数是多少?(手算)(答:≈0.7AEH)
⑹ 325D换算成十六进制数是多少?(手算)(答:145D)
⑺ 2AH换算成十进制数是多少?(手算)(答:42D)
⑻  1101010B换算成十六进制数是多少?(手算)(答:6AH)
⑼ B2H换算成二进制数是多少?(手算)(答:178D)
⑽ 已知用十六进制数表示的Unicode编码是5218H,问这个字符是什么?(不能用查表法求)(答:写出并选定“5218”,点击“Alt+X”后,得“刘”字)
⑾ 已知用十进制数表示的Unicode编码是8594D,问这个字符是什么?(不能用查表法求) (答:按住Alt键,在小键盘区键入“8594”后,得符号“→”)
⑿“他”字的十六进制Unicod码是多少?(不得查表)(答:在屏幕上键入“他”字并选定它后,点击“Alt+X”,得4ED6,即“他”字的Unicode码是U+4ED6)
⒀ 汉字区位码的编码范围是什么?(答:是1~94,不是0~94)
⒁ 汉字“大”的区位码是2083D,求它的交换码,并用十六进制数表示。(答:因为20D=14H;83D=53H,所以,用十六进制表示的区位码是1453H。其交换码就是1453H+2020H=3473H)
⒂ 汉字“高”的区位码是2463D,机内码是什么?(答:24D=18H;63D=3F,用十六进制表示的区位码是183FH。所以,“高”字的内码是183FH+A0A0H=B8DFH)
⒃ 在24×24点阵的字形码中,一个汉字占用多少字节?(答:24×24b÷8b/B=72B)
附:汉字区位码表(已删,如果网友需要,可以给我发E-mail)
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
刨根究底字符编码之六——简体汉字编码中区位码、国标码、内码、外码、字形码的区别及关系
计算机表示数据成分的内容
计算机发展史
汉字的ASC值为什么会是负数
基于哈希表和二叉树的词典研究(一)
文本与文本处理(一)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服