码迷,mamicode.com
首页 > 其他好文 > 详细

基于点阵字库的汉字显示

时间:2015-01-15 14:17:57      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:点阵字库   汉字显示   

使用字库HZK16,该字库是符合GB2312标准的16×16点阵字库,存储每个汉字需要32字节(16*16/8=32字节)。HZK16中的一个汉字的偏移地址计算公式(假设机内码为ABCD):offset=[(AB-0XA1)*94+(CD-0XA1)]*32
证明:

GB2312编码对所收录字符进行了分区处理,共94区,每区含有94位,这种表示方式称为区位码。

如“啊"位于16区的01位,所以它的区位码就是1601(区位码用十进制表示)。

由区位码得到一个汉字在GB2312中的序号:order=94*(区号-1)+(位号-1)(减1是因为区位号从1开始)。

因为计算机中存储的是机内码,机内码高低字节分别减去0XA0可得到区位码:
区号=AB-0XA0;位号=CD-0XA0;
故由机内码得到一个汉字在GB2312中的序号:order=94*(AB-0XA1)+(CD-0XA1)
对于16x16点阵字库,每个汉字占32字节,故该汉字在字库文件中的距离文件头的偏移字节数为:

offset=[(AB-0XA1)*94+(CD-0XA1)]*32

程序:

#include<stdio.h>
int main()
{
	FILE*fp=fopen("HZK16","rb");
	unsigned char buf[2];
	while(scanf("%s",buf)!=EOF)
	{
	  unsigned int order=94*(buf[0]-0XA1)+(buf[1]-0XA1);
	  unsigned int position=order*32;
	  fseek(fp, position,0);
      unsigned char tmp[32];
	  fread(tmp,sizeof(unsigned char),32,fp);
	  for(int i=0;i<32;i++)
	  {
		  //依次显示一个字节中的8位,若为1则显示'*',若为0则显示空格
		  for(int k=0;k<8;k++)
		  {
			  if((tmp[i]>>(7-k))&0X01)
				  printf("*");
			  else
				  printf(" ");
		  }
		  if(i%2==1)//每两字节(16位)一换行
	      printf("\n");
	  }
	   fseek(fp,0L,0);
	}
	fclose(fp);
	return 0;
}

技术分享



基于点阵字库的汉字显示

标签:点阵字库   汉字显示   

原文地址:http://blog.csdn.net/u010839382/article/details/42740389

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!