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);
}