APP下载

浅析汉字编码过程

2015-03-16黄小花

电脑知识与技术 2015年4期

黄小花

摘要:该文围绕了汉字的编码过程,详细介绍了输入码、区位码、国标码、机内码、字形码的编码方法。输入码是为方便汉字输入而形成的汉字编码为,国标码是为表示汉字而统一的编码,计算机还不能将国标码作为汉字在计算机中的表现形式,因为会和ASCII码发生冲突,所以又产生了汉字的机内码,机内码是存储汉字的编码,最终汉字是通过字形码或输出码将汉字输出。

关键词:汉字的编码;国标码;机内码; 字形码

中图分类号:G642 文献标识码:A 文章编号:1009-3044(2015)04-0181-02

Abstract: This paper around the coding process Chinese characters, detailed introduces the coding method for input code, area code, GB code, machine code, shape code. The input code is formed Chinese characters code for the convenience of Chinese characters input, GB code is unified for the said Chinese characters coding, computer can be GB code as a form Chinese characters in the computer, because ASCII codes and conflict, so they produced a Chinese characters within the machine code, machine code is only, font code is Chinese characters coding form to display and print output Chinese characters.

Key words: Chinese characters coding; GB code; machine code; font code

计算机是二进制世界,只能识别由0和1组成的二进制度,所有外部信息都要编码成二进制。如将十进制数通过数值转换编码成二进制,将西文字符通过ASCII码编码成二制,将声音、图像通过数/模转换编码成二进制度。

大多数情况下,我们输入的是汉字,汉字从进入计算机内部处理完毕到输出,同样需要进行编码。

1 汉字的输入码

用户选择输入法从键盘上把汉字输入计算机时所用的编码叫输入码,所以输入码是负责将汉字输入计算机而采用的编码。输入码与输入法有关,输入法不同,输入码的编码也是不同的。目前常用的输入法有音码类、形码类、音形混合类等多种输入法。用户可以选择一种或多种熟悉的输入法来输入汉字,而每种输入法的编码是不同的。如采用拼音输入法输入“装”字的编码为“zhuang”,而采用五笔输入法输入“装”字的编码为“ufy”,这说明汉字的输入码不是唯一的,它是一种外码,同一个字的输入码可以有多种不同的编码。

2 汉字的国标码与区位码

有由于汉字编码方案众多,各种方案又各有千秋,为了使汉字有一个统一的编码,我国在1980年颁布了汉字的编码标准即中华人民共和国标准交换代码,简称为国标码,代号GB2312-80。国标码规定一个汉字用2个字节表示,前一个字节表示区号,后一个字节表示位号,于是又得到了区位码。区位码中有94个区号,94个位号,用区号*位号就可得到一张区位码表,即94*94=8836的区位码表,在这个区位码表中有8836个区位。在这些区位中分布了6763个汉字,682个图形字符,还有一些空的区位,留待扩展使用。

国标是在汉字的区位码基础上得到的,只需要十进制的区位码的区号加32,同时位号加32就得到了汉字的国标码。国标码中将6763个汉字分成了两级汉字,其中一级汉字有3755个,它们是平时使用频率最高的汉字,在表中是按拼音排序的;二级汉字有3008个,它们是次常用汉字,在表中按部首/笔画顺序排列。

给出一个汉字,如何得到区位码和国标码呢?我们可以先通过区位码表查出该汉字的区位码,如“保”字处于区位码的第17区第3位,即区位码为“1703”。再将区码17+32=47,位号03+32=35,即可得出“保”字的国标码为“4735”。任意一个汉字只要先查出区位码,即可得出国标码。

3 国标码与区位码之间的关系

每个国标码或区位码都对应着一个唯一的汉字或符号,他们的编码方法相同,都是用2个字节来代码组成,每个字节的最高位都置0,其余14位二进制表示的编码。但是国标码并不等于区位码,两者间的区别在于:

第一,两者表示时采用的进位计数制不同。国标码采用四位的十六进制数表示,而区位码采用四位的十进制数表示。因为十六进制数我们很少用到,所以大家常用的是区位码。

第二,区位码表示的范围比国标码更宽。在GB-2312中预留了一些空区位,可以进行补充、扩展,经扩展的区位码从数量、范围上超过了GB-2312国标码。如区位码中有8836个区位,国标码使用了其中的7445个区位来表示汉字和图形符号。

第三,国标码是在区位码的基础上得到,其具体过程如下:首先将十进制的区位码区号转换为十六进制后加20H,再将十进制的区位码位号转换为十六进制后加20H,最后将转换后的两部分合在一起即可得到十六进制的国标码。

例如:“保”字的国标码为3123H ,它是经过下面的转换得到的:“保”字的区位码是1703,分别将其区号17,转化为十六进制11H,位号03转换成十六进制03H,即1103H,然后,再对区号和位号分别加上20H,得到“保”字的国标码:3123H

4 汉字的机内码

国标码仅能作为表示一个汉字的编码,汉字最终存储时不能使用国标码。汉字最终在计算机内部存储、加工、处理时需要使用汉字的机内码。

国标码的编码并不能唯一确定一个汉字。如前所述国标码用2个字节来表示一个汉字,每个汉字的最高字节是0,其余用不同的7位码值表示。这种编码会和西文字符编码ASCII码产生冲突。ASCII码是对字符的编码,规定一个字符用1个字节表示,该字节最高位是0,其余7位用不同的码值表示,两种编码中,因其前后字节的最高位为0,这样有会出现一个汉字的国标码可能会与两个字符的ASCII码相同,从而导致国标码会与ASCII码发生冲突。如“保”字,国标码为00110001和00100011,而西文字符“1”和“#”的ASCII也为00110001和00100011,这时内存中的两个字节00110001和00100011,表示的到底是一个汉字“保”还是两个西文字符“1”和“#”,于是就出现了每个字符或汉字编码不唯一,产生歧义。显然,国标码是不可能在计算机内部直接采用的,他只能作为表示汉字的一种编码,汉字在计算机内部的编码应采用机内码。

机内码与国标码之间存在着必然的联系。汉字的机内码采用变形国标码,是在国标码的基础上变换得到的,其变换方法为:即将两个字节的国标码每个字节的最高位由0改为1,2个字节除最高位之处的其余7位码值不变。显然,汉字机内码的两个字节的每个字节的最高位都是1,而西文字符字节的最高位为0,使得机内码的编码得到唯一,从而解决了与西文字符的ASCII码冲突的问题。

如:由上面我们知道,“保”字的国标码为00110001和00100011,第1字节为00110001B,第为字节为00100011B,要得到“保”字的机内码只需将两个字节的高位由0改1为,其余码值不变,即得到10110001B和10100011B 即为B1A3H,因此,汉字的机内码就是B1A3H。

汉字的机内码一般用十六进制表示,从十六制表示方法看, 汉字两字节的机内码和国标码每个字节这间相差80H,两者之间的等价的对应关系为:国标码+8080(H)=机内码

5 汉字字形码

一个汉字不但要通过输入码输入计算机、用国标码表示出来、用机内码存储,最终汉字还需要输出来,负责将汉字输出来的编码叫输出码或字形码。

汉字输出时采用的是点阵图,即将一个汉字放在一个M行N列的圆点组成的方块(称为汉字的字模点阵),那么每个汉字都可以用点阵中的一些点组成。每个点用一位二进制表示,有笔形的为1,否则为0,就可得到该汉字的字形码。

采用点阵图将一个汉字输出,点阵中的每一个点对应存储器中的一位,如用16*16点阵将一个汉字输出,其用到256个点,即256位。由于计算机中,8个二进制位作为一个字节,所以16*16点阵汉字需要32字节存储一个汉字。24*24点阵汉字需要72字节,32*32点阵汉字需要128字节,48*48点阵汉字需要288字节……点阵数越大,分辨率越高,字形越美观,但占用的存储空间越多。

采用点阵方式输出汉字,编码、存储方式简单、无需转换直接输出,但放大后产生的效果差。

参考文献:

[1] 杨飞宇.计算机应用基础教程[M].北京:机械工业出版社,2010.

[2] [美]Julia编著 .Visual Basic 6.0高级编程[M].北京:清华大学出版社, 2003.

[3] 刘勇.计算机应用基础教程[M].北京:水利水电出版社,2011.

[4] 郑有增,许文宪.Visual Basic程序设计[M].北京:清华大学出版社,2005.

[5] 百度百科:汉字编码http://baike.baidu.com/view/391899.ht.