the famous smile:C语言中显示汉字 - 青春正长 - 青春正长 - 和讯博客

来源:百度文库 编辑:偶看新闻 时间:2024/05/01 00:53:10
C语言中显示汉字[原创 2007-11-19 18:13:17 ]发表者: 青春正长  

        在Turbo C集成开发环境中不是汉化的,如何编制能显示汉字的C程序呢? 

这种方法是调用中文汉字库进行汉字显示。国家标准规定:汉字库分94个区,每个区有94个汉字(以位作区别),每个汉字在汉字库中有确定的区和位编号,这就是汉字的区位码。每个汉字在库中是以点阵字模形式存储的,一般采用16×16点阵(32字节)、24×24点阵(72字节),每个点用一个二进制位(0或1)表示,对应在屏幕上显示出来,就是相应的汉字。 

  由于在中文环境下,输入的是汉字的内码,我们必须将之转换成区位码,算出偏移量,从字库中找到对应的汉字,将其字模显示即可。 

  内码转换成区位码方法如下: 

   qh=c1-0xa0;

         wh=c2-0xa0; 

  其区位码就是: 

    qw=qh*0xff+wh 

  该汉字在字库中离起点的位置是: 

     offset=(94*(qh-1)+(wh-1))*32L 

        得到了数据之后再对每个字节的每个位进行判断,如果为1就用putpixel()在相应的点上画一点,如果为0就不进行画点操作。

 

                   

以下的代码部分为原创:  

 void hanzi16(int x,int y,char *s,int color,int row,int col)
{
     FILE *fp;
     char buf[16][2];
     int  i,j,k,m,n;
     unsigned char qh,wh;
     unsigned long offset;

     if( (fp=fopen("hzk16","rb"))==NULL )
     {
          closegraph();
          printf("Can‘t open hzk16");
          getch();
          exit(0);
     }

     while(*s)    ;遍历所有需要显示的汉字
     {
          qh=(*s)-0xa0;                                ;内码转区码
          wh=*(s+1)-0xa0;                           ;内码转位码
          offset=(94*(qh-1)+(wh-1))*32L;   ;计算该汉字在字库中的偏移量
          fseek(fp,offset,SEEK_SET);           ;在文件中定位
          fread(buf,32,1,fp);                          ;取出32字节的点阵字模存入BUF中
          for(i=0;i<16;i++)                            ;由于16X16点阵中有16行
              for(n=0;n                  for(j=0;j<2;j++)                     ;每行有2个字节
                      for(k=0;k<8;k++)              ;测试字节的位
                          for(m=0;m                             if( buf[i][j] & (0x80>>k) )    ;做“与”位操作,如果是1,就画点
                               putpixel(x+j*8*col+k*col+m,y+i*row+n,color);
          s+=2;                                            ;一个汉字占2个字节
          x+=(16*col);                                 ;下一列的输出位置
     }

     fclose(fp);
}

标签