• 用C语言显示汉字的演示程序


    汉字是方块字,宽高相等的汉字库在嵌入式领域有着广泛的应用,且其解析也相对来说是比较简单的。
    汉字在汉字库中的索引一般会遵循GB2312/GBK编码规则,GB2312/GBK规定汉字编码由2个字节组成,其中低字节区码,高字节为位码。本文以最常见的UCDOS中16x16的宋体字库HZK16来演示汉字的显示方法,HZK16中汉字的存放基于GB2312编码的顺序,每个汉字的点阵数据占32个字节,每个字节表征8个点的状态,每行从左至右的点的状态分别对应字节从高到低的位值。

    下面提供完整的演示程序以供参考,

    [cpp] view plaincopy
     
    1. #include <stdio.h>  
    2.   
    3. #define FONT_SIZE   (16)    /* 字体大小 */  
    4.   
    5. /* 
    6.   获取汉字在汉字库中的索引位置 
    7.   根据GB2312/GBK编码规则,汉字的低字节hz[0]是区码,高字节hz[1]是位码,汉字库从区位码0xa1a1开始存放汉字 
    8. */  
    9. #define HZ_INDEX(hz)    ((hz[0] - 0xa1) * 94 + (hz[1] - 0xa1))  
    10. #define DOTS_BYTES  (FONT_SIZE * FONT_SIZE / 8) /* 汉字点阵数据所占的字节数 */  
    11.   
    12. int main(int argc, char* argv[])  
    13. {  
    14.     FILE* hzk;  
    15.     unsigned char song[2] = "xcbxce"/* “宋”字的区位码为0xcbce */  
    16.     unsigned char dots[DOTS_BYTES];  
    17.     unsigned char b;  
    18.     int i, j, k;  
    19.   
    20.     /* 打开汉字库hzk16,并从中提取“宋”字的点阵数据 */  
    21.     if((hzk = fopen("hzk16""rb")) == NULL)  
    22.     {  
    23.         return -1;  
    24.     }  
    25.     fseek(hzk, HZ_INDEX(song) * DOTS_BYTES, SEEK_SET);  
    26.     fread(dots, sizeof(unsigned char), DOTS_BYTES, hzk);  
    27.     fclose(hzk);  
    28.   
    29.     /* 用“*”号根据点阵数据显示“宋”字 */  
    30.     for(i = 0; i < FONT_SIZE; i++)  
    31.     {  
    32.         /* 每行共FONT_SIZE / 8个字节 */  
    33.         for(j = 0; j < FONT_SIZE / 8; j++)  
    34.         {  
    35.             b = dots[i * 2 + j];  
    36.             /* 从左至右的点分别对应字节从高到低的位值 */  
    37.             for(k = 0; k < 8; k++)  
    38.             {  
    39.                 if(b & 0x80)  
    40.                     printf("%c "'*');  
    41.                 else  
    42.                     printf("  ");  
    43.                 b <<= 1;  
    44.             }  
    45.         }  
    46.         printf(" ");  
    47.     }  
    48.       
    49.     return 0;  
    50. }  

    程序编译运行后会出现如下的显示效果,

    [plain] view plaincopy
     
      1.             *                     
      2.               *                   
      3.   * * * * * * * * * * * * * *     
      4.   *                         *     
      5. *             *           *       
      6.               *                   
      7.               *           *       
      8. * * * * * * * * * * * * * * *     
      9.             * * *                 
      10.           *   *   *               
      11.         *     *     * *           
      12.       *       *         * * *     
      13.     *         *           *       
      14.   *           *                   
      15.               *                   
      16.               *     
    1. 挺好的先收藏
  • 相关阅读:
    a
    迭代 递归 反转链表 反转二叉树
    深入理解 Promise 之手把手教你写一版
    Golang在商业化广告的优化实践 https://mp.weixin.qq.com/s/joR1Y5t4a8fIs111XNZluA
    找BUG 题目理解 平衡二叉树 定义
    源码 json.Unmarshal json.Marshal
    大流量活动下钱包提现方案的设计与实现
    Scrum敏捷实践总结
    情况考虑不周 非边界值
    凡是正值 皆有贡献 保留
  • 原文地址:https://www.cnblogs.com/pengkunfan/p/3486595.html
Copyright © 2020-2023  润新知