HZK16字库文件的资料
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于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个字节就是我们要寻找的字符字模)
----------------------------------无敌分界线----------------------------------
上面说过了GB2312文件所对应的HZK16文件,存取数据是很简单的,但是实际上GB2312中的6763个字符看起来很多,实际使用的时候却经常会发现我们所要找的字符其实并不包含在里面,确实,GB2312标准是80年制订的汉字字符集标准,只包括了常见的字符,如果我们需要使用更多的汉字,那就必须使用GBK来代替它,当然使用的文件自然是HZK16.GBK了。
如何在嵌入式系统中使用大量的汉字和字符呢?
DOS前辈们经过艰辛的努力,将制作好的字模放到了一个个标准的库中以免去后辈的麻烦,这就是点阵字库文件。
一般我们使用16*16的点阵宋体字库,所谓16*16,是每一个汉字在纵、横各16点的区域内显示的。不过后来又有了HZK12、HZK24,HZK32和HZK48字库及黑体、楷体和隶书字库。虽然汉字库种类繁多,但都是按照区位的顺序排列的。前一个字节为该汉字的区号,后一个字节为该字的位号。每一个区记录94个汉字,位号则为该字在该区中的位置。
因此,汉字在汉字库中的具体位置计算公式为:94*(区号-1)+位号-1。减1是因为数组是以0为开始而区号位号是以1为开始的。这仅为以汉字为单位该汉字在汉字库中的位置,那么,如何得到以字节为单位得到该汉字在汉字库中的位置呢?只需乘上一个汉字字模占用的字节数即可,即:(94*(区号-1)+位号-1)*一个汉字字模占用字节数,而按每种汉字库的汉字大小不同又会得到不同的结果。以16*16点阵字库为例,计算公式则为:(94*(区号-1)+(位号-1))*32。汉字库文该从该位置起的32字节信息即记录了该字的字模信息。
☆打印字库文件和HZK12
如果你有UCDOS的HZK24S(宋体)、HZK24K(楷体)或HZK24H(黑体),你还可以使用不同字体的大字模汉字了。HZK24系列是24*24的点阵字库,每字模占用3*24字节。如果你按照HZK16的显示方法的话,你会看到......呵呵,字被放倒了。这是因为该类字库与一般的汉字库不同,这类大字模汉字库是专供打印的打印字库,为了打印的方便将字模都放倒了,你使用时,只要将字模的位信息纵横转置显示即可。例如你如果定义为mat[24][3]则应该这样输出: for(i=0;i<24;i++)
for(j=0;j<24;j++)
if((0x80>>i%8)&mat[j][i/8])/*转置显示*/
putpixel(j+x,y+i,color);
还有一类字库HZK12,虽然属于标准字库类型,但如果你将它的字模当作12*12位计算的话,根本无法正常显示汉字。因为字库设计者为了使用的方便,字摸每行的位数均补齐为8的整数倍,于是实际该字库的位长度是16*12,虽然每行都多出了4位,但这4位都是0(不显示),并不影响显示效果。