转自: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. int main(void)
  4. {
  5. FILE *fp=0;
  6. char ch=0;
  7. unsigned short int start=0x8140;
  8. unsigned char part1=0;
  9. unsigned char part2=0;
  10. fp=fopen("gbk.txt","wb");
  11. if(fp==NULL)
  12. {
  13. perror("Cann't open gbk.txt");
  14. return -1;
  15. }
  16. else
  17. printf("Creat file gbk.txt/n");
  18. while(start < 0xfeff)
  19. {
  20. part1=start>>8;
  21. part2=start;
  22. fputc(part1,fp);
  23. fputc(part2,fp);
  24. start++;
  25. }
  26. fclose(fp);
  27. printf("success!");
  28. return 0;
  29. }

运行后,用记事本打开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. #define START 0x8140
  5. #define DATANUM 0x20
  6. int displaychar(FILE *fp,unsigned short int dispch,char fillch,char start_x,char start_y);
  7. int main(void)
  8. {
  9. FILE * fp=0;
  10. unsigned short int testch = 0xb0ae;  //汉字'爱‘的gbk码
  11. fp = fopen("gbk.bin","rb");
  12. initscr();
  13. displaychar(fp,testch,'*',0,0);
  14. refresh();
  15. while(1);
  16. endwin();
  17. fclose(fp);
  18. return 0;
  19. }
  20. /*
  21. * fp指向点阵字库二进制文件
  22. * 以点阵方式显示一个GBK字符
  23. * dispch是要显示的字符,fillch是填充点阵的字符
  24. * start_x,start_y是显示的起始坐标
  25. */
  26. int displaychar(FILE *fp,unsigned short int dispch,char fillch,char start_x,char start_y)
  27. {
  28. char x=start_x;
  29. char y=start_y;
  30. unsigned int location=(dispch-START)*DATANUM;
  31. int i=0;
  32. int j=0;
  33. char buf=0;
  34. fseek(fp,location,SEEK_SET);
  35. for(i=0;i<DATANUM;i++)
  36. {
  37. buf=fgetc(fp);
  38. //显示一个字节
  39. for(j=0;j<8;j++)
  40. {
  41. move(y+j,x);
  42. if( buf & (0x01<<j) )
  43. {
  44. addch(fillch);
  45. }
  46. }
  47. if(x == (start_x+15))
  48. {
  49. x=start_x;
  50. y=start_y+8;
  51. }
  52. else
  53. x++;
  54. }
  55. return 0;
  56. }

显示效果如下:

下载:

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

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

GBK点阵显示字库的制作和使用的更多相关文章

  1. 在SDL中显示GBK点阵汉字

    大家注意到没有,RA2的中文版本使用的是GBK点阵字库,这样做有一个好处:不管玩家是用的简体还是繁体都能识别显示的文字. GBK的意思大概是“国家标准汉字扩展字符集”吧,记不清了.但它的确是个好东东, ...

  2. ASCII字符点阵字库的制作和使用

    转自:http://blog.csdn.net/exbob/article/details/6532772 开发环境: Win7,Eclipse,MinGW 1.生成ASCII字符文件 ASCII编码 ...

  3. LED点阵显示名字

    学习了一周的单片机,然后中途有事打断了两周,现在温习一下之前学的东西,用“普中科技单片机”上的LED点阵显示自己的名字. P1接J19(绿).P2接J20(红),P0接J12(数码管段选):5V电压: ...

  4. Android-如何显示版本号并制作3秒跳转页

    前言 大家好,给大家带来Android-如何显示版本号并制作3秒跳转页的概述,希望你们喜欢 软件技术人员,时代作者,从 Android 到全栈之路,我相信你也可以!阅读他的文章,会上瘾!You and ...

  5. LED点阵显示

    /*********************************************************** 8*8LED点阵---显示数字实验 实现现象:下载程序后点阵上显示数字0 注意 ...

  6. Android的Recovery中font_10x10.h字库文件制作

    任务是要汉化Android中的Recovery,就了解了bootable/recovery/minui/font_10x18.h这个英文字库的来历,最终汉化的时候并没有自己汉字字库,用的github上 ...

  7. c#调用c++dll(c++界面在c#显示)____制作dll

    1.c++dll含界面,以摄像头dll为例: 1.直接在c++SDK上调试运行成功,生成dll. 2.留一个调用接口(格式如下,写在cpp文件中,即函数体): extern "C" ...

  8. [OpenGL]点阵显示生日快乐小程序

    刚工作没多久的时候,业余学习了OGL的知识(这是写不好的借口吧), 在某个异性生日的时候写了这个程序. 编译平台: MinGW GCC gcc -o happOK happyOK.c -lglut32 ...

  9. 【STM32H7教程】第53章 STM32H7的LTDC应用之汉字小字库和全字库制作

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第53章       STM32H7的LTDC应用之汉字小字库 ...

随机推荐

  1. python实现接口测试到unittest框架集成

    接口测试是面试测试岗位基本都会问到的问题,但是对于一些刚做测试的小伙伴可能并不是很熟悉,也有可能了解接口测试,但是完全不知道接口自动化怎么做.下面我们大概介绍一下. 首先我们需要知道接口自动化测试的目 ...

  2. 20-ab压力测试及nginx性能统计模块

    一:找到apache ab模块. ab -c 1000 -n 50000 http://127.0.0.1/index.html 查看信息: 超过1024个线程 出现错误,说打开文件太多了.cket: ...

  3. freopen - C/C++文件输入输出利器

    freopen以前经常使用,比较方便,可以当作模板,在中间替换为自己的代码即可使用. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <stdio.h&g ...

  4. iOS-代理托付的使用

    #import "Rigester_ViewController.h" #import "Rigester_ViewController.h" @interfa ...

  5. mongodb 集群部署--分片服务器搭建

    部署分片服务器 1.分片 为了突破单点数据库服务器的I/O能力限制,对数据库存储进行水平扩展,严格地说,每一个服务器或者实例或者复制集就是一个分片. 2.优势 提供类似现行增·长架构 提高数据可用性 ...

  6. C#中特性,以及应用场景(收藏链接)

    1:http://www.tracefact.net/CLR-and-Framework/Reflection-Part3.aspx 2:http://www.cnblogs.com/landeanf ...

  7. 【题解】CJOI2019 登峰造鸡境 (Prufer序列+斯特林数)

    [题解]CJOI2019 登峰造鸡境 (Prufer序列+斯特林数) 题目背景 舒服了. 题目描述 你有一颗n个点的无根树,每个点有有一个标号(1~n). 现在你知道,总共有m个叶子节点,求不同的树的 ...

  8. 题解 P1001 【A+B Problem】

    #include<iostream> using namespace std; #define I int a,b; #define AK cin>>a>>b; # ...

  9. centos安装php5.6

    配置yum源 追加CentOS 6.5的epel及remi源. # rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel- ...

  10. python网络爬虫之使用scrapy自动登录网站

    前面曾经介绍过requests实现自动登录的方法.这里介绍下使用scrapy如何实现自动登录.还是以csdn网站为例. Scrapy使用FormRequest来登录并递交数据给服务器.只是带有额外的f ...