中文字库简介,GB2312字库用法

GB2312编码 :1981年5月1日发布的简体中文汉字编码国家标准。GB2312对汉字采用双字节编码,收录7445个图形字符,其中包括6763个汉字。

BIG5编码 :台湾地区繁体中文标准字符集,采用双字节编码,***收录13053个中文字,1984年实施。

GBK编码 :1995年12月发布的汉字编码国家标准,是对GB2312编码的扩充,对汉字采用双字节编码。GBK字符集***收录21003个汉字,包含国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字。

GB18030编码 :2000年3月17日发布的汉字编码国家标准,是对GBK编码的扩充,覆盖中文、日文、朝鲜语和中国少数民族文字,其中收录27484个汉字。GB18030字符集采用单字节、双字节和四字节三种方式对字符编码。兼容GBK和GB2312字符集。

Unicode编码 :国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换。

GB2312编码是第一个汉字编码国家标准,由中国国家标准总局1980年发布,1981年5月1日开始使用。GB2312编码***收录汉字6763个,其中一级汉字3755个,二级汉字3008个。同时,GB2312编码收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。

分区表示

GB2312编码对所收录字符进行了“分区”处理,***94个区,每区含有94个位,***8836个码位。这种表示方式也称为区位码。

01-09区收录除汉字外的682个字符。

10-15区为空白区,没有使用。

16-55区收录3755个一级汉字,按拼音排序。

56-87区收录3008个二级汉字,按部首/笔画排序。

88-94区为空白区,没有使用。

举例来说,“啊”字是GB2312编码中的第一个汉字,它位于16区的01位,所以它的区位码就是1601。

双字节编码

GB2312规定对收录的每个字符采用两个字节表示,第一个字节为“高字节”,对应94个区;第二个字节为“低字节”,对应94个位。所以它的区位码范围是:0101-9494。区号和位号分别加上0xA0就是GB2312编码。例如最后一个码位是9494,区号和位号分别转换成十六进制是5E5E,0x5E+0xA0=0xFE,所以该码位的GB2312编码是FEFE。

GB2312编码范围:A1A1-FEFE,其中汉字的编码范围为B0A1-F7FE,第一字节0xB0-0xF7(对应区号:16-87),第二个字节0xA1-0xFE(对应位号:01-94)。

/zh/hanzi-gb2312-bianma.php ( GB2312编码表 )

/bianma/zifuji.php(转utf8)

HZK12?'16x12?宋体汉字点阵?一个汉字24Byte

HZK14?'16x14?宋体汉字点阵?一个汉字28Byte

HZK16?'16x16?宋体汉字点阵?一个汉字32Byte

HZK16F?'16x16?繁体宋体汉字点阵?一个汉字32Byte

HZK24F?'24x24?仿宋汉字打印点阵?一个汉字72Byte

HZK24H?'24x24?黑体汉字打印点阵?一个汉字72Byte

HZK24K?'24x24?楷体汉字打印点阵?一个汉字72Byte

HZK24S?'24x24?宋体汉字打印点阵?一个汉字72Byte

HZK24T?'24x24?宋体符号打印点阵?一个符号72Byte

HZK40S?'40x40?宋体汉字点阵?一个汉字200Byte

HZK40T?'40x40?宋体符号点阵?一个符号200Byte

HZK48S?'48x48?宋体汉字点阵?一个汉字288Byte

HZK48T?'48x48?宋体符号点阵?一个符号288Byte

HZK16字库是符合GB2312标准的16×16点阵字库

HZK16字库里的16×16汉字一***需要256个点来显示,也就是说需要32个字节才能达到显示一个普通汉字的目的。

一个汉字占两个字节,这两个中前一个字节为该汉字的区号,后一个字节为该字的位号。其中,每个区记录94个汉字,位号为该字在该区中的位置。所以要找到汉字在hzk16库中的位置就必须得到它的区码和位码。

区码: 汉字的 第一个字节-0xA0 (因为汉字编码是从0xA0区开始的, 所以文件最前面就是从0xA0区开始, 要算出相对区码)

位码: 汉字的 第二个字节-0xA0

这样我们就可以得到汉字在HZK16中的绝对偏移位置:

offset=(94*(区码-1)+(位码-1))*32

注解:

区码减1是因为数组是以0为开始而区号位号是以1为开始的

(94*(区号-1)+位号-1)是一个汉字字模占用的字节数

最后乘以32是因为汉字库文应从该位置起的32字节信息记录该字的字模信息(前面提到一个汉字要有32个字节显示)

如果你有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(不显示),并不影响显示效果。