HZK16的介紹及使用

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;   
 int fd;      
 unsigned char qh,wh;   
 unsigned long offset;   
 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 Open hzk16\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);
}

發佈了30 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章