zoukankan      html  css  js  c++  java
  • 基于点阵字库的汉字显示 分类: 中文信息处理 2015-01-15 14:08 359人阅读 评论(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("
    ");
    	  }
    	   fseek(fp,0L,0);
    	}
    	fclose(fp);
    	return 0;
    }



    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    C#中d的??和?
    Android开发匹配字符笔记
    25个CSS3 渐变和动画效果教程
    精选PSD素材下载周刊【Goodfav PSD 20130720】
    25个吸引眼球的广告设计
    智能手机移动应用的8个趋势
    为网页设计师准备的30个使用的HTML5框架
    来自极客标签10款最新设计素材-系列十一
    九度OJ 1008最短路径问题
    最短路+邻接表+最小堆的C++代码实现
  • 原文地址:https://www.cnblogs.com/luo-peng/p/4646223.html
Copyright © 2011-2022 走看看