汉字在字库中的偏移地址计算

本文介绍了GB2312和GBK两种汉字字库的基本信息,并详细解释了如何计算这两种字库中汉字的偏移地址,包括公式和示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >




汉字在字库中的偏移地址计算

 

常用的汉字字库有

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

则为对应汉字点阵数据

在字库里面的起始地址。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值