hzk16 的介绍以及简单的使用方法
HZK16 字库是符合 GB2312 标准的 16×16 点阵字库,HZK16 的 GB2312-80 支持的汉字
有 6763 个,符号 682 个。其中一级汉字有 3755 个,按声序排列,二级汉字有 3008 个,按
偏旁部首排列。我们在一些应用场合根本用不到这么多汉字字模,所以在应用时就可以只提
取部分字体作为己用。
HZK16 字库里的 16×16 汉字一共需要 256 个点来显示,也就是说需要 32 个字节才能
达到显示一个普通汉字的目的。
我们知道一个 GB2312 汉字是由两个字节编码的,范围为 A1A1~FEFE。A1-A9 为符号
区,B0 到 F7 为汉字区。每一个区有 94 个字符(注意:这只是编码的许可范围,不一定都
有字型对应,比如符号区就有很多编码空白区域)。下面以汉字“我”为例,介绍如何在 HZK16
文件中找到它对应的 32 个字节的字模数据。
前面说到一个汉字占两个字节,这两个中前一个字节为该汉字的区号,后一个字节为该
字的位号。其中,每个区记录 94 个汉字,位号为该字在该区中的位置。所以要找到“我”
在 hzk16 库中的位置就必须得到它的区码和位码。(为了区别使用了区码和区号,其实是一
个东西,别被我误导了)
区码:区号(汉字的第一个字节)-0xa0
(因为汉字编码是从 0xa0 区开始的,所以文
件最前面就是从 0xa0 区开始,要算出相对区码)
位码:位号(汉字的第二个字节)-0xa0
这样我们就可以得到汉字在 HZK16 中的绝对偏移位置:
offset=(94*(区码-1)+(位码-1))*32
注解:
1、区码减 1 是因为数组是以 0 为开始而区号位号是以 1 为开始的
2、(94*(区号-1)+位号-1)是一个汉字字模占用的字节数
3、最后乘以 32 是因为汉字库文应从该位置起的 32 字节信息记录该字的字模信息(前面提
到一个汉字要有 32 个字节显示)
有了偏移地址就可以从 HZK16 中读取汉字编码了,剩下的就是文件操作了,就不说了,
要看代码(汉字)就是下面的:“hzk16 汉字库的简单读写程序 ”,是一个最简单的 c 语言
程序。
hzk16 汉字库的简单读写程序
//hzk 汉字点阵
#include
#include
int main()
{
unsigned char incode[3]="我"; // 要读出的汉字,GB 编码
unsigned char qh = 0, wh = 0;
unsigned long offset = 0;
char mat[16][2] = {0};
FILE *HZK = 0;
int i,j,k;
//获得区码
//获得位码
//每个汉字,占两个字节, 取其区位号
qh = incode[0] - 0xa0;
wh = incode[1] - 0xa0;
offset = (94*(qh-1)+(wh-1))*32; //得到偏移位置
if((HZK=fopen("hzk16", "rb")) == NULL)
{
printf("Can't Open hzk16\n");
getchar();
return 0;
}
fseek(HZK, offset, SEEK_SET);
fread(mat, 32, 1, HZK);
fclose(HZK);
//显示
for(i=0; i<16; i++)
{
for(j=0; j<2; j++)
{
for(k=0; k<8; k++)
{
if(mat[i][j] & (0x80>>k))
{//测试为 1 的位则显示
printf("%c",'#');
}
else
{
printf("%c",'-');
}
}
}
printf("\n");
}
getchar();
return 1;
}