logo资料库

hzk16汉字库的介绍、使用以及程序编写.doc

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
hzk16的介绍以及简单的使用方法
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; }
分享到:
收藏