关于HZK16字库文件的资料...
UCDOS中的HZK16字库是符合GB2312标准的16×16点阵字库,UCWIN GOLD 1.0 中的HZK16.GBK继续保持对HZK16的兼容性,但是另外还支持GBK字符,当然,存取字库的方式自然也有些变化。
HZK16用的很多,字库里的字体也很不错,但是汉字数目太大,常用的汉字有大几千个,加上不常用的和对应的繁体字,总数在2万以上,HZK16的GB2312-80支持的汉字有6763个,符号682个。其中一级汉字有3755个,按声序排列,二级汉字有3008个,按偏旁部首排列(至于排列方法,我倒不关注,因为这主要是汉字输入法所要面临的问题,而不是点阵汉字显示关注的对象)。在很多场合是用不到这么多汉字字模的,比如嵌入式系统的液晶显示屏或是像手机、GBA那样的个人电子通讯工具。有必要利用现有的HZK16和HZK16.GBK文件中的部分字体,把他们提取出来做为己用。就算是需要使用整个GB2312、GBK字符集汉字,对这两个文件的了解也是必不可少的。
对于HZK16字库里的16×16汉字(其实只用到了16×15,即16行15列,最后1列是空白的,但是作为GBK汉字,则使用了最后这一列)来说一共需要256个点来显示一个普通的汉字,那么共需要32个字节才能达到该目的。
首先,一个GB2312汉字是由两个字节编码的,范围为A1A1~FEFE。A1-A9为符号区,B0到F7为汉字区。每一个区有94个字符(当然,这只是编码的许可范围,而不是这些编码都对应有字型,比如符号区就有很多编码空白区域)。所以,当接受到了一个汉字编码譬如“鹿”字,如何在HZK16文件中找到它对应的32个字节的字模数据呢。
计算方法如下:
C2H-A1H=21H (33D区,因为汉字编码是从A1区开始的,所以文件最前面就是从A1区开始)
B9H-A1H=18H (24D位,道理如上所述,这就是所谓的区位码)
21H×5EH+18H=C36H (5EH就是94D,代表一个区有94个字符,C36H就是说这个字符在HZK16里是第C36H个)
C36H×20H=186C0H (20H就是32D,代表一个字符占32个字节,这里得到的186C0H就是“鹿”字在HZK16文件中的偏移地址,从这里开始之后的32个字节就是我们要寻找的字符字模)