汉字在字库中的偏移地址计算
常用的汉字字库有
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
则为对应汉字点阵数据
在字库里面的起始地址。