一般我们使用16x16的点阵宋体字库,所谓16x16,是每一个汉字在纵、横各16点的区域内显示的。不过后来又有了HZK12、HZK24,HZK32和HZK48字库及黑体、楷体和隶书字库。虽然汉字库种类繁多,但都是按照区位的顺序排列的。前一个字节为该汉字的区号,后一个字节为该字的位号。每一个区记录94个汉字,位号则为该字在该区中的位置。
区号,位号
因此,汉字在汉字库中的具体位置计算公式为:94*(区号-1)+位号-1。减1是因为数组是以0为开始而区号位号是以1为开始的。这仅为以汉字为单位该汉字在汉字库中的位置,那么,如何得到以字节为单位得到该汉字在汉字库中的位置呢?只需乘上一个汉字字模占用的字节数即可,即:(94*(区号-1)+位号-1)一个汉字字模占用字节数,而按每种汉字库的汉字大小不同又会得到不同的结果。以1616点阵字库为例,计算公式则为:(94*(区号-1)+(位号-1))*32。汉字库文该从该位置起的32字节信息即记录了该字的字模信息。
示例代码:
// An highlighted block
#include <stdio.h>
#include <stdlib.h>
void Disp_HZK16(vooid)
{
FILE *fp;
char qh,wh;
unsigned long offset;
int array[16][16];
char mat[16][2];
char inclode[2] = {"涛"}; // 要读出的字符
int i,j,k;
char a = 0;
qh = inclode[0] - 0xa0; //区号
wh = inclode[1] - 0xa0; //位号
offset = (94*(qh - 1) +(wh - 1))*32;
printf("输出的16位汉字,区号,位号\n");
putchar(inclode[0]);
putchar(inclode[1]);
putchar(',');
printf("%d,%d\n",qh,wh);
if((fp = fopen("HZK16","rb")) == NULL)
{
printf("\ncan not open file strike any key exit");
getch();
exit(1);
}
fseek(fp,offset,SEEK_SET);
fread(mat,32,1,fp);
fclose(fp);
for(i=0; i<16; i++)
{
for(j=0; j<2; j++)
{
for(k=0; k<8; k++)
{
if(mat[i][j] & (0x80>>k))array[i][a+k] = '+';
else array[i][a+k] = ' ';
}
a += 8;
}
a = 0;
}
for(i=0; i<16; i++)
{
for(j=0; j<16; j++)
{
printf("%c",array[i][j]);
}
printf("\n");
}
printf("\n");
}
int main(int argc, char *argv[])
{
Disp_HZK16();
return 0;
}
运行截图:

参考地址:https://download.csdn.net/download/fengyecl/7073701
2273

被折叠的 条评论
为什么被折叠?



