首页 > 编程语言 >用C语言显示汉字的演示程序

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

时间:2023-02-17 09:57:30浏览次数:25  
标签:hz 演示 字节 hzk C语言 char 汉字库 汉字

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

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

 

  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] = "\xcb\xce"; /* “宋”字的区位码为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("\n");  
  47.     }  
  48.       
  49.     return 0;  
  50. }  

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

 

    1.             *                     
    2.               *                   
    3.   * * * * * * * * * * * * * *     
    4.   *                         *     
    5. *             *           *       
    6.               *                   
    7.               *           *       
    8. * * * * * * * * * * * * * * *     
    9.             * * *                 
    10.           *   *   *               
    11.         *     *     * *           
    12.       *       *         * * *     
    13.     *         *           *       
    14.   *           *                   
    15.               *                   
    16.               *     
  1. 挺好的先收藏
root

标签:hz,演示,字节,hzk,C语言,char,汉字库,汉字
From: https://www.cnblogs.com/kn-zheng/p/17129088.html

相关文章

  • c语言填空:统计输入的字符中所有大写字母的个数
    #include<stdio.h>//用来统计输入的字符中所有大写字母的个数,用#结束输入main(){inta[26],i;charch;for(i=0;i<26;i++)a[i]=【1】;ch=ge......
  • C语言填空 :逆顺输出
    #include<stdio.h>//功能:从键盘输入一个整数,如果不高于9999则逆序输出,否则打印“输入范围错误"main(){【1】;【2】;if(x<=9999)do{......
  • C语言填空:s=3+13+23+33+....+103
    #include<stdio.h>//求s=3+13+23+...+103main(){int【1】;for(i=0;【2】;i++)s=【2】;printf("s=【4】\n",s);getchar();}#include<......
  • C语言填空:求s=1-3+5-7+...-99+101并输出
    #include<stdio.h>//求s=1-3+5-7+...-99+101并输出main(){inti,t=1,【1】;for(i=1;【2】;【3】){s=【4】;t=【5】;}......
  • C语言填空:求二维数组中最大值,并输出所有最大值对应的行号与列号
    #include<stdio.h>//找出二维数组中的最大值,并输出所有最大值对应的行与列main(){inta[5][5]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,24,24,15,16,21,17,18,19,24,......
  • 解决C#读写txt文件中文(汉字)乱码的问题
    不少朋友遇到用System.IO.StreamReader读取包含汉字的txt文件时,经常会读出乱码(StreamWriater写文本文件也有类似的问题),原因很简单,就是文件的编码(encoding)和StreamReader/W......
  • C语言
    C语言的特点:C语言虽是高级编程语言,但它也具备了能够和汇编语言相媲美的低层处理(内存操作及位操作)功能。变量和函数:不管使用什么样的编程语言,程序内容都是由数据和处理构......
  • C语言之旅
    C语言的特点     C语言是AT&T贝尔实验室的D.M.Ritchie在1973年推出的程序开发语言。C语言虽是高级编程语言,但它也具备了能够和汇编语言相媲美的低层处理(......
  • C语言:二维数组中最大值及行号列号
    #include<stdio.h>//求二维数组中的最大值及对应的行号与列号main(){inta[5][5]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,24,15,16,21,17,18,19,20,22,23},max,......
  • C语言网络编程winsock
    目录前言思路服务器代码客户端效果图前言参考自https://www.bilibili.com/video/BV1s7411z7jK/?spm_id_from=333.1007.top_right_bar_window_history.content.click思......