GB2312、GBK的点阵字库建立与索引

时间:2024-02-20 16:17:40

1、汉字机内码

以汉字“啊”为例,它的的机内码为0xB0A1,0xB0为机内码高字节,0xA1为机内码低字节

2、GB2312

GB2312收录简化汉字及符号、字母、日文假名等共7445个图形字符,其中汉字占6763个。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区,按汉语拼音字母/笔形顺序排列:第二级汉字是次常用汉字计3008个,置于56~87区,按部首/笔画顺序排列。故而GB2312 最多能表示6763 个汉字。点阵库只要按照这个编码规则从0XA1A1开始,逐一建立,每个区的点阵大小为每个汉字所用的字节数乘以94。这样,就可以得到在这个字库里面定位汉字的方法:

Hp=((GBH-0xA1)×94+GBL-0XA1)×(size);

其中GBH、GBL 分别代表GB2312 的第一个字节和第二个字节(也就是高位和低位),size 代表每个汉字点阵所需的字节数,Hp 则为对应汉字点阵数据在字库里面的起始地址。

3、GBK

而GBK内码完全兼容GB2312,同时支持繁体字,总汉字数有2万多个,编码格式如下,每个GBK码由2个字节组成,第一个字节为0X81~0XFE,第二个字节分为两部分,一是0X40~0X7E,二是0X80~0XFE。其中与GB2312相同的区域,字完全相同。把第一个字节代表的意义称为区,那么GBK里面总共有126个区(0XFE~0X81+1),每个区内有190个汉字(0XFE~0X80+0X7E~0X40+2),总共就有126x190=23940个汉字。点阵库只要按照这个编码规则从0X8140开始,逐一建立,每个区的点阵大小为每个汉字所用的字节数乘以190。这样,就可以得到在这个字库里面定位汉字的方法:
当GBKL<0X7F 时:Hp=((GBKH-0x81)×190+GBKL-0X40)×(size);
当GBKL>0X80 时:Hp=((GBKH-0x81)×190+GBKL-0X41)×(size);

其中GBKH、GBKLL 分别代表GBK 的第一个字节和第二个字节(也就是高位和低位),size 代表每个汉字点阵所需的字节数,Hp 则为对应汉字点阵数据在字库里面的起始地址。

 

 

4、点阵偏移量计算验证

4.1 以16*16点阵为例,生成16*16的GB2312和GBK点阵字库

 

 

4.2 打开GB2312_16x16CPP和GBK_16x16CPP两个文件,在两个文件内搜索定位到“啊”的点阵,确认“啊”的点阵值(这一步的点阵数据比较没有什么意义,主要是谨慎起见,确保点阵值无误)

 

 4.3 根据“啊”的机内码(0xB0A1)分别计算在GB2312 16x16点阵字库和GBK 16x16点阵字库内的偏移量

16x16点阵每个汉字所需的字节数为32

GB2312:Hp=((GBH-0xA1)×94+GBL-0XA1)×(size);   Hp=((0xB0-0xA1)×94+0xA1-0XA1)×(32)=45120(0xB040)

GBK:Hp=((GBKH-0x81)×190+GBKL-0X41)×(size); Hp=((0xB0-0x81)×190+0xA1-0X41)×(32)=288832(0x46840)

4.4 打开GB2312_16x16BIN,定位到0xB040地址;打开GBK_16x16BIN,定位到0x46840地址

 

 可以看到,两个文件定位到的点阵数据一模一样,并且与CPP文件内的点阵数据也一样。至此,偏移量计算验证完毕。

接下来,你就可以把bin文件找个地方存放起来,然后根据机内码计算偏移量随意调用了