• GBK点阵显示字库的制作和使用


    转自:http://blog.csdn.net/exbob/article/details/6539643

    GBK编码共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。以两个字节表示一个汉字,编码范围是0x8140~0xfefe,兼容GB2318,并覆盖了unicode中的所有汉字。Win7记事本默认以GBK保存汉字。

    关于GBK的详细信息:http://baike.baidu.com/view/25421.htm

     

    开发环境

    Win7、Eclipse、MinGW

     

    1.生成GBK全字符文件

    运行下面这段代码,生成GBK全字符文件gbk.txt,编码范围0x8140~0xfefe

    [cpp] view plain copy
    1. #include <stdio.h>  
    2. #include <stdlib.h>  
    3.   
    4. int main(void)  
    5. {  
    6.     FILE *fp=0;  
    7.     char ch=0;  
    8.     unsigned short int start=0x8140;  
    9.     unsigned char part1=0;  
    10.     unsigned char part2=0;  
    11.   
    12.     fp=fopen("gbk.txt","wb");  
    13.     if(fp==NULL)  
    14.     {  
    15.         perror("Cann't open gbk.txt");  
    16.         return -1;  
    17.     }  
    18.     else  
    19.         printf("Creat file gbk.txt/n");  
    20.     while(start < 0xfeff)  
    21.     {  
    22.         part1=start>>8;  
    23.         part2=start;  
    24.         fputc(part1,fp);  
    25.         fputc(part2,fp);  
    26.         start++;  
    27.     }  
    28.     fclose(fp);  
    29.     printf("success!");  
    30.   
    31.     return 0;  
    32. }  

    运行后,用记事本打开gbk.txt文件,可以看到其中的字符。

     

    2.生成字模二进制文件

    用“牧码字模”软件打开gbk.txt文件,选择字体为宋体,字重为1,点阵大小16*16,对齐方式为左下,取模方式为“纵向取模、高位在下”。输出格式选择bin。然后点击输出,会生成一个temp.bin文件,改名为gbk.bin。

    gbk.bin文件就是GBK编码字符的点阵字库文件,每32个字节可以绘制一个字符,例如第一个字符‘丂’的显示如下:

    取模的数据为:

    0x02, 0x02, 0x02, 0xc2, 0xb2, 0x8e, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x40, 0x3f, 0x00, 0x00, 0x00, 0x00, 

     

    3.使用字库文件

    gbk.bin文件中按GBK编码的大小排列,每32个字节可以显示一个字符,假设一个字符的GBK编码为NUM,那么它的点阵数据第一个字节的位置就是:

    (NUM-0x8140)*32

    从这个字节开始,读取32个字节,将其按按照取模方式显示即可。

    例如:用Linux的终端模拟点阵屏幕,每个字符位置就是一个点,程序如下:

    [cpp] view plain copy
    1. #include <stdio.h>  
    2. #include <unistd.h>  
    3. #include <curses.h>  
    4.   
    5. #define START 0x8140  
    6. #define DATANUM 0x20  
    7.   
    8. int displaychar(FILE *fp,unsigned short int dispch,char fillch,char start_x,char start_y);  
    9.   
    10. int main(void)  
    11. {  
    12.     FILE * fp=0;  
    13.     unsigned short int testch = 0xb0ae;  //汉字'爱‘的gbk码  
    14.   
    15.     fp = fopen("gbk.bin","rb");  
    16.   
    17.     initscr();  
    18.   
    19.     displaychar(fp,testch,'*',0,0);  
    20.   
    21.     refresh();  
    22.   
    23.     while(1);  
    24.     endwin();  
    25.     fclose(fp);  
    26.     return 0;  
    27. }  
    28.   
    29. /* 
    30.  * fp指向点阵字库二进制文件 
    31.  * 以点阵方式显示一个GBK字符 
    32.  * dispch是要显示的字符,fillch是填充点阵的字符 
    33.  * start_x,start_y是显示的起始坐标 
    34.  */  
    35. int displaychar(FILE *fp,unsigned short int dispch,char fillch,char start_x,char start_y)  
    36. {  
    37.     char x=start_x;  
    38.     char y=start_y;  
    39.     unsigned int location=(dispch-START)*DATANUM;  
    40.   
    41.     int i=0;  
    42.     int j=0;  
    43.     char buf=0;  
    44.   
    45.     fseek(fp,location,SEEK_SET);  
    46.   
    47.     for(i=0;i<DATANUM;i++)  
    48.     {  
    49.         buf=fgetc(fp);  
    50.   
    51.         //显示一个字节  
    52.         for(j=0;j<8;j++)  
    53.         {  
    54.             move(y+j,x);  
    55.             if( buf & (0x01<<j) )  
    56.             {  
    57.                 addch(fillch);  
    58.             }  
    59.         }  
    60.   
    61.         if(x == (start_x+15))  
    62.         {  
    63.             x=start_x;  
    64.             y=start_y+8;  
    65.         }  
    66.         else  
    67.             x++;  
    68.     }  
    69.     return 0;  
    70.   
    71. }  

    显示效果如下:

    下载:

    字库文件:http://download.csdn.net/source/3359198

    字模提取软件:http://download.csdn.net/source/3358791

  • 相关阅读:
    正式定居博客圆,发些以前在Topcoder上的练习题,对算法和STL有兴趣的朋友可以看下:)
    TopCoder真题讲解之二
    “命名空间“System”中不存在类型或命名空间名称“Linq”(是缺少程序集引用吗?)”
    短信发送
    JavaScript打印和预览等
    .net获取IP地址的几种方法转载
    WinForm中控件与背景透明
    用C#实现C/S模式下软件自动在线升级转
    Microsoft Access 时间函数汇总
    .net 发送Email 单发 群发
  • 原文地址:https://www.cnblogs.com/alan666/p/8312006.html
Copyright © 2020-2023  润新知