HZK16的介绍及使用

来源:互联网 发布:淘宝网商城女鞋休闲鞋 编辑:程序博客网 时间:2024/05/18 02:44

HZK16的简单介绍及使用:
 HZK16字库是符合GB2312标志的16x16点阵字库,HZK16的GB2312-80支持的汉字有6763个,符号
682个,其中一级汉字有3755个,按升序排列(a-z),二级汉字有3008个,按偏旁部首排序。我们在
一些应用场合根本用不到这么多汉字字模,所以在应用时就可以只提取部分字体作为己用6。
 HZK16字库里的16x16汉字一共需要256个点来显示,也就是说需要256/8=32个字节来显示一个
汉字,我们知道一个GB2312汉字是由2个字节编码的,范围为A1A1~~FEFE。其中A1-A9为符号区,
B0-F7为汉字区。每一个区有94个字符(注:这只是编码的许可范围,不一定都有字型对应,比如
符号区就有许多编码空区域)
 下面以"我"字为例,介绍如何在HZK16文件中找到它对应的32个字节的数据。一个汉字占两
个字节,这两个字节的第一个字节为该汉字的的区号,后一个字节为该汉字的位号。其中,每
个区记录了94个汉字,位号为该汉字在该区中的位置。所以我们需要找到"我"字在HZK16库中的
位置就必须得到它的区码和位码。

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

位码:(汉字的第二个字节) - 0xA0(位码是从0xA0开始的,0xA0并没有使用)

所以该汉字在HZK16中的位置offset:
offset = (94*(区码-1)+(位码-1))*32
 注: 区码减1是因为数组以0为开始区号,位号是以1开始

 

简单测试代码:


#include
#include
#include
#include
#include
#include

int main(void)
{
 int i =0,j,k;   
 intfd;      
 unsigned charqh,wh;   
 unsigned longoffset;   
 char mat[32]; 
 char bytes;
 qh = 0xd6 -0xa1;           
 wh = 0xd0 -0xa1;               
 offset = (94*qh +wh)*32;  
  
 fd = open("HZK16",O_RDONLY);
 if(fd <0){   
  printf("Can't Openhzk16\n");   
  exit(-1);   
   
   lseek(fd,offset,SEEK_SET);   
   read(fd,mat,32);

    for(j= 0 ; j < 16 ; j++){
       for(i = 0 ; i < 2 ; i++){
    
   bytes =mat[i+j*2]; // 0,1,2
            for(k = 7 ; k >= 0 ; k--){
               if(bytes &(1<<k)) {
                            printf("%c",'#');
                        }else{  
    printf("%c",'-');

                        }
  }
 }
  printf("\n");
    }
    close(fd);
}

0 0
原创粉丝点击