前言:最近有个关于泰国文字识别并打印的项目。之前对泰文的了解只听过“萨瓦迪卡”-_-!!,所以前两天在学习泰文的排版规范及unicode编码,了解之后开始学习文字点阵打印的原理及代码编写。今天学习了汉字16*16点阵字库的使用。

这里首先感谢陪她去流浪大佬的文章(这个大佬的id一听就是有女朋友的,羡慕o.o),文章简介明了、通俗易懂,代码讲解也非常的详细。

原理:

HZK16字库是符合GB2312国家标准的16×16点阵字库,HZK16的GB2312-80支持的汉字有6763个,符号682个。其中一级汉字有 3755个,按声序排列,二级汉字有3008个,按偏旁部首排列。

HZK16字库里的16×16汉字一共需要256个点来显示,也就是说需要32个字节才能达到显示一个普通汉字的目的。我们在一些应用场合根本用不到这么多汉字字模,所以在应用时就可以只提取部分字体作为己用就可以了。

我们知道一个GB2312汉字是由两个字节编码的,范围为0xA1A1~0xFEFE。A1-A9为符号区,B0-F7为汉字区。每一个区有94个字符(注意:这只是编码的许可范围,不一定都有字型对应,比如符号区就有很多编码空白区域)

下面以汉字「我」为例,介绍如何在HZK16文件中找到它对应的32个字节的字模数据。

前面说到一个汉字占两个字节,这两个中前一个字节为该汉字的区号,后一个字节为该字的位号。其中,每个区记录94个汉字,位号为该字在该区中的位置。所以要找到「我」在hzk16库中的位置就必须得到它的区码和位码。

  • 区码:汉字的第一个字节-0xA0,因为汉字编码是从0xA0区开始的,所以文件最前面就是从0xA0区开始,要算出相对区码
  • 位码:汉字的第二个字节-0xA0

这样我们就可以得到汉字在HZK16中的绝对偏移位置:offset = (94*(区码-1)+(位码-1))*32 。

注解:

  • 区码减1是因为数组是以0为开始而区号位号是以1为开始的
  • (94*(区号-1)+位号-1) 是一个汉字字模占用的字节数
  • 最后乘以32是因为汉字库文应从该位置起的32字节信息记录该字的字模信息(前面提到一个汉字要有32个字节显示)

图示:

“我”的点阵输出如下图所示:

所以,“我”在HZK16*16点阵字库的存放序列为(一行一行地保存,共16行,每行2个字节,共32个字节):

程序输出应该这样:

源代码实例:

版本1

#include <stdio.h>int main(void)
{FILE* fd = NULL;int i, j, k, offset;int flag;unsigned char buffer[32];unsigned char word[3] = "我";unsigned char key[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };fd = fopen("hzk16", "rb");if (fd == NULL){fprintf(stderr, "error hzk16\n");return 1;}offset = (94 * (unsigned int)(word[0] - 0xa0 - 1) + (word[1] - 0xa0 - 1)) * 32;fseek(fd, offset, SEEK_SET);fread(buffer, 1, 32, fd);for (k = 0; k<32; k++){printf("%02X ", buffer[k]);}printf("\n");for (k = 0; k<16; k++){for (j = 0; j<2; j++){for (i = 0; i<8; i++){flag = buffer[k * 2 + j] & key[i];printf("%s", flag ? "●" : "○");}}printf("\n");}fclose(fd);fd = NULL;return 0;
}

版本2

#include <stdio.h>
#include <stdlib.h>int main(void)
{FILE* fphzk = NULL;int i, j, k, offset;int flag;unsigned char buffer[32];unsigned char word[5];unsigned char key[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};fphzk = fopen("hzk16", "rb");if(fphzk == NULL){fprintf(stderr, "error hzk16\n");return 1;}while(1){printf("输入要生成字模的汉字(多个):");for(;;){fgets((char*)word, 3, stdin);if(*word == '\n') break;offset = (94*(unsigned int)(word[0]-0xa0-1)+(word[1]-0xa0-1))*32;fseek(fphzk, offset, SEEK_SET);fread(buffer, 1, 32, fphzk);for(k=0; k<16; k++){for(j=0; j<2; j++){for(i=0; i<8; i++){flag = buffer[k*2+j]&key[i];printf("%s", flag?"●":"○");}}printf("\n");}printf("uchar code key[32] = {");for(k=0; k<31; k++){printf("0x%02X,", buffer[k]);}printf("0x%02X};\n", buffer[31]);printf("\n");}}fclose(fphzk);fphzk = NULL;return 0;
}

版本3

#include <stdio.h>
#include <stdlib.h>int main(void)
{FILE* fphzk = NULL;int i, j, k, offset;int flag;unsigned char buffer[32];unsigned char word[2] = {0xCE, 0xD2}; // 改成你的转码后的汉字编码unsigned char key[8] = { 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01 };fphzk = fopen("hzk16", "rb");if(fphzk == NULL){fprintf(stderr, "error hzk16\n");return 1;}offset = (94*(unsigned int)(word[0]-0xa0-1)+(word[1]-0xa0-1))*32;fseek(fphzk, offset, SEEK_SET);fread(buffer, 1, 32, fphzk);for(k=0; k<16; k++){for(j=0; j<2; j++){for(i=0; i<8; i++){flag = buffer[k*2+j]&key[i];printf("%s", flag?"●":"○");}}printf("\n");}for(k=0; k<31; k++){printf("0x%02X,", buffer[k]);}printf("\n");fclose(fphzk);fphzk = NULL;return 0;
}

各种字库下载地址:http://pan.baidu.com/share/link?shareid=2514580636&uk=320828865

HZK16汉字16*16点阵字库的使用及实例程序相关推荐

  1. java中点阵字库的解析

    最近研究点阵字库的展示,搜到很多东西,而且大多都是C语言做的,作为一个Android开发的码农,整理了一篇java版的,一方面自己记录,一方面帮助有需要的人... 点阵字,顾名思义,就是用点组成一个个 ...

  2. 点阵字库的生产原理(转)

    源:点阵字库的生产原理 所有的汉字或者英文都是下面的原理, 由左至右,每8个点占用一个字节,最后不足8个字节的占用一个字节,而且从最高位向最低位排列. 生成的字库说明:(以12×12例子) 一个汉字占 ...

  3. 16 16点阵c语言程序,用C语言编程16点阵字库

    用C语言编程16点阵字库 2007-07-31 12:28 #include #include #include #include #include #include #include #define ...

  4. 第七篇 亚龙236 led 16*32点阵显示显示汉字

    第七篇 亚龙236 led 16*32点阵显示显示汉字 亚龙236设备显示模块有led点阵,16*32点阵可以显示汉字或图形. 这个模块只能教学用,实际的户外屏用的电路和它从原理上不一样.数码管模块也 ...

  5. 读hzk32_点阵字库HZK12 HZK16 HZK24 ASC12 ASC16 简介 及 使用方法[附源码]

    如何在嵌入式系统中使用大量的汉字和字符呢? DOS前辈们经过艰辛的努力,将制作好的字模放到了一个个标准的库中以免去后辈的麻烦,这就是点阵字库文件. 一般我们使用16*16的点阵宋体字库,所谓16*16 ...

  6. 点阵字库HZK12 HZK16 HZK24 ASC12 ASC16 简介 及 使用方法[附源码]

    字库点阵格式定义 ASC12  ' 8x12 ASCII点阵 一个字符12Byte ASC16  ' 8x16 ASCII点阵 一个字符16Byte ASC48  '24x48 ASCII点阵 一个字 ...

  7. android开发之:将汉字转化为16*16字模

    首先说说基本知识: 1.HZK16字库是符合GB2312标准的16×16点阵字库,HZK16的GB2312-80支持的汉字有6763个,符号682个.其中一级汉字有 3755个,按声序排列,二级汉字有 ...

  8. 【综合】发帖顶你--汉字点阵字库操作

    [综合]发帖顶你–汉字点阵字库操作 其实到不是我不想写后面几道题,主要是确实没啥好写的,就真的只是体量大而已,就不写思路了,按照题目的意思模拟就行 代码 #include <stdio.h> ...

  9. 汉字点阵字库的原理与显示

    [转自 http://hi.baidu.com/ahnniu/blog/item/7b72d058bea162d89c82048f.html] 一.什么是点阵? 我们先看两个字的点阵图: A字母的点阵 ...

  10. 16*64点阵屏的c语言程序,16*64点阵程序 - 单片机/MCU论坛 - 电子技术论坛 - 广受欢迎的专业电子论坛!...

    最近在家无聊,做了一个16*64的点阵,行扫描用的是154,列用的是595,效果还不错,把程序贴出来共享. #include #define uchar unsigned char #define u ...

最新文章

  1. 55_pytorch,自定义数据集
  2. supermap iserver java 6r许可_SuperMap iserver Java 6R 在 linux 上安装和配置 | 学步园
  3. java ora 28040_Oracle 11g与112c中ORA-28040 错误解决
  4. 学Python前途如何,带你了解Python的优势!
  5. 学习mfc的一些方法
  6. label包裹input,点击label响应两次解决方法
  7. drools规则拼接_Drools-规则层次结构和条件执行
  8. MyBatis基础:MyBatis缓存(5)
  9. java odbc 驱动_Java java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序...
  10. php 手机号 去掉86,手机号前面的+86是什么意思
  11. 在c语言中有函数leapyear定义如下,职业教育概论——职业教育的发展历史超星尔雅答案题库...
  12. 对于“ …不需要安装.NET Framework 4.0 ” 以及 “已在此计算机上安装相同或更高版本的 .NET Framework 4 ” 等问题 的解决办法
  13. 双系统卸载ubuntu
  14. 破解win7开机密码!
  15. TF2-Tips:自定义model.fit
  16. 价值几千行代码的一键安装开源啦,欢迎各位领导莅临指导(贡献代码)
  17. 被迫选择了到了外包公司
  18. 今天全网的网站都变成了灰色了,这其中是如何实现的呢?
  19. 【kubernetes/k8s概念】多集群联邦 kubefed 用户向导
  20. 光纤接入网广域网连接拓扑结构设计

热门文章

  1. 分支定界法解TSP问题(one-tree算法定界)附java代码
  2. 常用数据接口汇总,百度、谷歌、头条、微博指数,高校名单,疫情数据...
  3. GoF 的 23 种设计模式的分类和功能
  4. mysql主从配置修改重启无效
  5. 成功爬虫下载抖音用户视频(无水印)
  6. 服务器组态文件己写保护,组态王常见问题集锦(一)
  7. 上海税控盘登陆修改服务器地址,上海税控盘登陆修改服务器地址
  8. spring整合kaptcha验证码
  9. 气象信息无线监测采集系统
  10. 谷梁科技多元化一卡通系统应用