如何在嵌入式系统中使用大量的汉字和字符呢?

DOS前辈们经过艰辛的努力,将制作好的字模放到了一个个标准的库中以免去后辈的麻烦,这就是点阵字库文件。

一般我们使用16*16的点阵宋体字库,所谓16*16,是每一个汉字在纵、横各16点的区域内显示的。不过后来又有了HZK12、HZK24,HZK32和HZK48字库及黑体、楷体和隶书字库。虽然汉字库种类繁多,但都是按照区位的顺序排列的。前一个字节为该汉字的区号,后一个字节为该字的位号。每一个区记录94个汉字,位号则为该字在该区中的位置。

因此,汉字在汉字库中的具体位置计算公式为:94*(区号-1)+位号-1。减1是因为数组是以0为开始而区号位号是以1为开始的。这仅为以汉字为单位该汉字在汉字库中的位置,那么,如何得到以字节为单位得到该汉字在汉字库中的位置呢?只需乘上一个汉字字模占用的字节数即可,即:(94*(区号-1)+位号-1)*一个汉字字模占用字节数,而按每种汉字库的汉字大小不同又会得到不同的结果。以16*16点阵字库为例,计算公式则为:(94*(区号-1)+(位号-1))*32。汉字库文该从该位置起的32字节信息即记录了该字的字模信息。

☆打印字库文件和HZK12

如果你有UCDOS的HZK24S(宋体)、HZK24K(楷体)或HZK24H(黑体),你还可以使用不同字体的大字模汉字了。HZK24系列是24*24的点阵字库,每字模占用3*24字节。如果你按照HZK16的显示方法的话,你会看到......呵呵,字被放倒了。这是因为该类字库与一般的汉字库不同,这类大字模汉字库是专供打印的打印字库,为了打印的方便将字模都放倒了,你使用时,只要将字模的位信息纵横转置显示即可。例如你如果定义为mat[24][3]则应该这样输出:

for(i=0;i<24;i++)

for(j=0;j<24;j++)

if((0x80>>i%8)&mat[j][i/8])

putpixel(j+x,y+i,color);

还有一类字库HZK12,虽然属于标准字库类型,但如果你将它的字模当作12*12位计算的话,根本无法正常显示汉字。因为字库设计者为了使用的方便,字摸每行的位数均补齐为8的整数倍,于是实际该字库的位长度是16*12,虽然每行都多出了4位,但这4位都是0(不显示),并不影响显示效果。

HZK16字库是符合GB2312标准的16×16点阵字库,HZK16的GB2312-80支持的汉字有6763个,符号682个。其中一级汉字有3755个,按声序排列,二级汉字有3008个,按偏旁部首排列。我们在一些应用场合根本用不到这么多汉字字模,所以在应用时就可以只提取部分字体作为己用。

HZK16字库里的16×16汉字一共需要256个点来显示,也就是说需要32个字节才能达到显示一个普通汉字的目的。

我们知道一个GB2312汉字是由两个字节编码的,范围为A1A1~FEFE。A1-A9为符号区,B0到F7为汉字区。每一个区有94个字符(注意:这只是编码的许可范围,不一定都有字型对应,比如符号区就有很多编码空白区域)。下面以汉字“我”为例,介绍如何在HZK16文件中找到它对应的32个字节的字模数据。

前面说到一个汉字占两个字节,这两个中前一个字节为该汉字的区号,后一个字节为该字的位号。其中,每个区记录94个汉字,位号为该字在该区中的位置。所以要找到“我”在hzk16库中的位置就必须得到它的区码和位码。(为了区别使用了区码和区号,其实是一个东西,别被我误导了)

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

位码:位号(汉字的第二个字节)-0xa0

这样我们就可以得到汉字在HZK16中的绝对偏移位置:

offset=(94*(区码-1)+(位码-1))*32

注解:1、区码减1是因为数组是以0为开始而区号位号是以1为开始的

2、(94*(区号-1)+位号-1)是一个汉字字模占用的字节数

3、最后乘以32是因为汉字库文应从该位置起的32字节信息记录该字的字模信息(前面提到一个汉字要有32个字节显示)

有了偏移地址就可以从HZK16中读取汉字编码了,剩下的就是文件操作了,就不说了,要看代码如下,是一个最简单的c语言程序。

hzk汉字点阵 int i,j,k; unsigned char incode[3]="我"; // 要读出的汉字 unsigned char qh,wh; unsigned long offset; // 占两个字节, 取其区位号 qh = incode[0] - 0xa0;/

/获得区码 wh = incode[1] - 0xa0; /

/获得位码 offset = (94*(qh-1)+(wh-1))*32; / *得到偏移位置* / FILE *HZK; char mat[32]; if((HZK=fopen("hzk16", "rb")) == NULL) { printf("Can't Open hzk16\n"); exit(0); } fseek(HZK, offset, SEEK_SET); fread(mat, 32, 1, HZK);

//显示

for(j=0;j<16;j++)

for(i=0;i<2;i++)

for(k=0;k<8;k++)

if(mat[j][i]&(0x80>>k))

{

printf("%s",'#');

}else{ printf("%s",'-');

}

fclose(HZK);

fclose(fp);

读hzk32_点阵字库HZK12 HZK16 HZK24 ASC12 ASC16 简介 及 使用方法[附源码]相关推荐

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

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

  2. 读hzk32_最全HZK12,HZK16,HZK24,HZK32,HZK40,HZK48,ASC12, ASC16,ASC24, ASC32, ASC48字库+读取代码...

    [实例简介] 这几天接了一个项目,需要制作点阵文字,所以接触了字库这东西,由于网上字库挺多的,但是不全,有的字库全,但是字库的读取代码只有一部分,所以还是花费了一天时间搞这东西.现在整理了一份叫全的字 ...

  3. Qt读写锁(QWriteLocker、QReadLocker)的理解和使用(含部分源码)

    文章目录 一.QReadWriteLock和QWriteLocker.QReadLocker(个人理解) 二.QWriteLocker.QReadLocker的使用 总结 相关文章 一.QReadWr ...

  4. 低亮度人脸检测、附源码——CVPR2021之 Low Light Face Detection【一文读懂】

  5. Python 用点阵字库描绘出国庆祝福语:祝福伟大祖国,更加繁荣昌盛 我爱你,中国

    目录 ❤️一段老代码 ❤️点阵字库原理 ❤️改写C代码 ❤️改进python代码 在给网友答题时突然间想到的,要把点阵字库拿出来研究研究的.适逢国庆佳节,刚好用它来打印国庆节祝福语,以表达我对伟大祖国 ...

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

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

  7. 读写锁ReentrantReadWriteLock源码分析

    文章目录 读写锁的介绍 写锁详解 写锁的获取 写锁的释放 读锁详解 读锁的获取 读锁的释放 锁降级 读写锁的介绍 在并发场景中用于解决线程安全的问题,我们几乎会高频率的使用到独占式锁,通常使用java ...

  8. 小象学院源码共读之Executor解析

    Executor解析 Executor解析 Executor类的初始化 线程池threadPool及taskReaperPool详解 子类TaskRunner详解 子类TaskReaper详解 参考内 ...

  9. 我与掘金合作出了源码共读第一期,首发超400人报名,快来参与~

    大家好,我是若川. 最近有不少新朋友关注我.对我不是很了解的,或许可以读我的2021年度总结.诚邀各位新老读者朋友参加源码共读活动. 同时我和掘金合作,共同出了源码共读第一期,11月25日--12月2 ...

最新文章

  1. js循环动态绑定带参数函数遇到的问题及解决方案[转]
  2. sqlserver 遇到以零作除数错误的处理 不报错的解决方法
  3. 1.15 Java冒泡排序法
  4. 什么是协议转换器?协议转换器的定义
  5. C#LeetCode刷题之#39-组合总和(Combination Sum)
  6. Fastsocket:高扩展性的 Socket 以及 Linux 内核的底层网络实现
  7. 腾讯王者荣耀AI论文首次曝光:五AI王者局开黑与人类战队打成平手
  8. 纯 css 实现 a 标签 loading 效果
  9. 转载--卷积神经网络卷积层池化层输出计算公式
  10. matlab读取txt文件
  11. 【实战模拟】使用Kali Linux进行域名解析——模拟测试
  12. oracle如何禁用job,Oracle中如何停用JOB及如何使用JOB
  13. JS 下拉菜单内容交换
  14. java实现开根号算法
  15. 美国科技大佬们最爱看的书
  16. No connection could be made because the target machine actively refused it 127.0.0.1:808 的解决办法...
  17. 2017.08.20【NOIP提高组】模拟赛B组 【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)...
  18. 特斯拉电动汽车接连发生两起致命车祸 美国监管机构已介入调查
  19. java中ref是啥意思_java – web.xml中的resource-ref是什么用的?
  20. jquey学习篇 第一篇

热门文章

  1. 分布式、高并发、高性能场景(抢购、秒杀、抢票、限时竞答)数据一致性解决方案
  2. Linux驱动——mmc sd card初始化流程(十一)
  3. 含并行连结的网络 GoogLeNet / Inception V3 动手学深度学习v2 pytorch
  4. 2019xupt-acm校赛 题解 ( F.猜球球 ) by出题组tongtong
  5. PV UV 日活 月活
  6. 小米手机与计算机如何连接网络连接,小米手机怎么通过电脑上网如何将手机与电脑相连...
  7. linux c编译安装,uClinux设置(安装,编译)
  8. MakeMKV for mac(MKV视频格式转换工具)
  9. 我的IT成长路——为梦想扬帆起航
  10. Ubuntu18.04平台下用GitHub搭建个人博客(含域名绑定和更换主题)