汉字在字库中的偏移地址计算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汉字在字库中的偏移地址计算
常用的汉字字库有GB2312字库和GBK字库两种。
GB2312收录简化汉字及符号、字母、日文假名等共7 445个图形字符,其中汉字占6 763个。GB2312规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。GB2312―80包含了大部分常用的一、二级汉字,和9区的符号。该字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集,这也是最基本的中文字符集。其编码范围是高位0xa1~0xfe,低位也是0xa1~0xfe;汉字从0xb0a1开始,结束于0xf7fe。GB2312将代码表分为94个区,对应第一字节(0xa1~0xfe);每个区94个位(0xa1~0xfe),对应第二字节,两个字节的值分别为区号值和位号值加32(20H),因此也称为区位码。01~09区为符号、数字区,16~87区为汉字区(0xb0~0xf7),10~15区、88~94区是有待进一步标准化的空白区。GB2312将收录的汉字分成两级:第一级是常用汉字计3755个,置于16~55区,按汉语拼音字母/笔形顺序排列:第二级汉字是次常用汉字计3 008个,置于56~87区,按部首/笔画顺序排列。故而GB2312最多能表示6763个汉字。而GBK内码完全兼容GB2312,同时支持繁体字,总汉字数有2万多个,编码格式如下,每个GBK码由2个字节组成,第一个字节为0X81~0XFE,第二个字节分为两部分,一是0X40~0X7E,二是0X80~0XFE。其中与GB2312相同的区域,字完全相同。把第一个字节代表的意义称为区,那么GBK里面总共有126个区(0XFE~0X81+1),每个区内有190个汉字(0XFE~0X80+0X7E~0X40+2),总共就有126x190=23 940个汉字。点阵库只要按照这个编码规则从0X8140开始,逐一建立,每个区的点阵大小为每个汉字所用的字节数乘以190。这样,就可以得到在这个字库里面定位汉字的方法:
当GBKL<0X7F时:Hp=((GBKH-0x81)×190+GBKL-0X40)×(sizex2);
当GBKL>0X80时:Hp=((GBKH-0x81)×190+GBKL-0X41)×(sizex2);
其中GBKH、GBKLL分别代表GBK的第一个字节和第二个字节(也就是高位和低位),size代表汉字字体的大小(比如16字体,12字体等),Hp则为对应汉字点阵数据在字库里面的起始地址。
对于GBK字库和GB2312字库,他们的解码部分部分略有不同,这个区别主要是由于他们的编码方式不同引起的,对于GBK字库,解码的方式如下:
qh=*code;
ql=*(++code);
if(ql<0x7f)
ql -= 0x40;
else
ql -= 0x41;
qh -= 0x81;
foffset = ((unsigned long)190*qh + ql)*(size * 2);
对于GB2312字库,解码的方式如下:
qh=*code;
ql=*(++code);
ql -= 0xa1;
qh -= 0xa1;
foffset = ((unsigned long)94*qh + ql)*(size * 2);
其中qh、ql分别代表GBK的第一个字节和第二个字节(也就是高位和低位),size 代表汉字字体的大小(比如16字体,12字体等),foffset则为对应汉字点阵数据在字库里面的起始地址。