-246- | PC机汇编语言实战精解 | ![]() |
|||||||||||||||||||
的字模库,如UCDOS所带的HZK16(HZK16F为繁体)。如果能够搞清这些字模库的结构,就可以从这些字模库中提取出汉字字模数据。为此要先搞清汉字的编码方法。 GB-2312-80标准一共收录了6763个常用的汉字和682个全角符号,一共是7445个字符。这些文字和符号是分区存放的,下面给出的这个表就是第1区内收录的字符和第16区内收录的汉字,可以看出一个区内共有汉字94个,为了便于汉字的检索,我们根据汉字所在的区号与这个汉字在所在区中的偏移位置为每个汉字编了码,比如"啊"字是第16区的第一个字,所以编码为1601;"白"字是第16区的第55个字,所以编码为1655;同理"剥"字编码为1694。 由于这种编码方法是根据某个汉字的"区"与"位"而来,所以这种编码一般称为"区位"码,左面两位称"区码",右面两位称"位码"。根据汉字的区位码我们就可以计算出某个汉字在整个字库中的偏移位置,公式为"(区码-1) 94+位码"。 区位码仅仅用于汉字的检索,真正在机器内部并不用区位码表示汉字。我们都清楚凡是字符在机器内部都是用一些数字表示的,用于表示字符的这些数字就称为字符的编码。在PC系统中西文字符最带用的编码系统为ASCII码,每一个字符对应一个字节的数据。那么如何用数字表示汉字呢? 最容易想到的一个方案就是直接用区位码表示汉字。这确实是个方案,不过它并不可行。可以举个很简单的例子来说明:比如从键盘输入一个字符串"HELLO!"主机就会从键盘接收到这样一串数字--72、69、76、76、79、33(用十进制表示)。如果汉字是用区位码表示的话,对于这样一串数字计算机就可以有两种理解,或者将其理解为"HELLO!",或者将其理解为"桢袄锪"。计算机究竟响应哪一个呢?除非我们给计算机足够的智能使其自己能判断"桢袄锪"没有意义,否则计算机将无所适从。 实际上给汉字进行编码还是有规律可循的。首先我们应该明确下面这样一些事实: (1)汉字的内码必须由两个字节组成;中文字符共有七千多个,必须用两个字节才能无重复地表示所有中文字符。 (2)汉字的内码不能占用标准打字键盘上所有西文字符的ASCII码,而且汉字的编码应该容易与西文字符区分; (3)汉字的内码应该可以用某种算法转换为对应的区位码;因为区位码可以在国标汉字库中检索汉字。 这是三项最基本的规律,根据这三点我们来看看汉字的实际编码方案是怎样的。 组成汉字内码的两个字节其最高位都为1,即两个数字都大于127(也可以理解为两个都是负数,无所谓)。西文字符都集中于ASCII码表的前半部分,即基本ASCII码表之中,汉字内码采用了扩展ASCII码,这样即可做到不与西文字符相冲突,而且也便于区分汉字与西文字符。 具体地说这表示汉字的两个字节都是从0A1H开始,表8-1给出了汉字库中最前面两区全角字符的内码,可以看到内码的低字节可以用于区分汉字所在的区,而高字节可以区分汉字在其所在区中的位置。 这样的内码是很容易转换成区位码的,"区码=内码低字节-0A0H,位码=内码高字节-0A1H"。由此可见这种编码方式是符合前述三个基本原则的,不过它也有一些弊病,比如西文制表符在中文系统中往往被显示成一些汉字。好在这不是主要矛盾,把"┌─"当成"谀"总比把"HELLO!"当成"桢袄锪"要强。 结合前面讲的利用区位码计算汉字在整个汉字库中偏移量的公式,即可得出通过汉字内码计算汉字在字库中的偏移量的方法,即:(内码低字节-0A1H)x94+(内码高字节-0A1H)。 |
|||||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |