数码之家

 找回密码
 立即注册
搜索
查看: 9581|回复: 26

【MY808_DIY】从此随意自制各种点阵字库

[复制链接]
发表于 2019-8-24 17:50:48 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 lyy-cy 于 2019-8-24 18:02 编辑

因为做天气时钟,想要显示汉字,参考了网上的帖子开始只想做GB2312的字库,后来想挑战一下就开始折腾。

一、GB2312和英文字库(各种字体
这个没有难度,看下面操作过程,半路上、顺便就能解决。请耐心看完。


二、GBK字库。
GBK 亦采用双字节表示,总体编码范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 xx7F 一条线。总计 23940 个码位,共收入 21886 个汉字和图形符号,其中汉字(包括部首和构件)21003 个,图形符号 883 个。
为什么要剔除 xx7F 一条线,网上有人说:你看一下ASCII码表就知道了,各种编码应该都要避免0x08和0x7f这两个字符,以及其他的控制字符。0x08就是'\b',表示BackSpace,向前删除一个字符;0x7f则表示DEL,向后删除一个字符。另外说一下DEL的编码为什么是0x7f,我们都知道ASCII码是7位的,以前打纸带的时候,如果打错了,就要把所有位置全打上洞,表示这一个字节是无效的。所以7位的全1就用来表示DEL。


打开一个GBK标准编码表。如右图,果真有个空缺。


GBK点阵字库实验1.jpg

更要命的是下面还有更多空缺:

GBK点阵字库实验2.jpg

不过空缺也有个特点就是,gbk编码没有对应的汉字,所以只要解码不成功,用一个‘□’占位就可以了,这样也不改变,汉字的排列顺序。
GB2312和GBK都是能用汉字编码解读出汉字排列顺序的,只要有正确的汉字排列顺序文本,就可以任意生成符合规范的点阵字库。
首先写个程序生成左边的那个文本,为了方便观看加上了回车,但是真正要做字库的时候要去掉回车空行。
  1. # 生成GBK字库文本
  2. GBK_file_path = r'GBK字库文本.txt'
  3. gb_txt_file = open(GBK_file_path,'w',encoding='gbk') #这个是包含所有gb2312文字的txt
  4. for GBK_H in range(0x81,0xff):
  5.     for GBK_L in range(0x40,0xff):
  6.         GBK_CODE_H = GBK_H.to_bytes(1,"big")    # 拼接成 bytes
  7.         GBK_CODE_L = GBK_L.to_bytes(1,"big")    # 拼接成 bytes
  8.         GBK_CODE = GBK_CODE_H + GBK_CODE_L      # 拼接成 bytes

  9.             txt_char = GBK_CODE.decode('gbk')

  10.             gb_txt_file.write(txt_char)
  11. gb_txt_file.close()
复制代码
上面的代码就是两个循环,Python写的,生成一个txt文件。这文件后面有下载。

三、生成字库
先确认取模方式,看懂这个图就可以了。
汉字取模1.jpg
开始操作(下面这个软件,基本上大家都有)

GBK字库生成.jpg

使用也是异常简单:
  1. 因为第一汉字  啊  的GBK码是  0x8140,所以每个汉字GBK码 高位-0x81  低位-0x40,因为每一区位的汉字有 12*16-1=191个,所以汉字位置编号是
  2. AB = GBK_高2位字节-0x81           #第一个汉字  81  40
  3. CD = GBK_低2位字节-0x40
  4. offset = AB*(191)+CD                    #每个区191个汉字
复制代码

四、软件验证
GBK点阵字库实验.jpg
完全符合
五、硬件验证
生成了一个40x48的宋体加粗GBK字库。用编码器写入

20190824_125135.jpg

烧录.jpg

20190824_152707.jpg

20190824_152710.jpg

点击下面图片可以看到视频。


最后这个文本文件大家下载回去后就可任意生成各种字库了。
前后折腾了两天才完全搞定,希望大家多多下载,挣点M。

GBK字库文本.rar (983 Bytes, 下载次数: 26)





总结:ascll、GB2312和GBK点阵字库就是按编码顺序把汉字点阵取模的数值依次存储。用的时候根据前面规则求出顺序位置,读出一组数值。关键是:顺序、位置。









打赏

参与人数 8家元 +240 收起 理由
郁闷_boy + 20 優秀文章
慕名而来 + 20 原創內容
tempchar + 20 优秀
wenxueroom + 20 支持下
leetaotao + 20 原創內容
家睦 + 100
williamgarci + 20 謝謝分享
人艰不拆了 + 20

查看全部打赏

 楼主| 发表于 2019-8-24 18:07:35 | 显示全部楼层
本帖最后由 lyy-cy 于 2019-8-26 15:24 编辑

顺便说一下:经过几天摸索  UTF-8 网页抓取的编码也搞定了,只能查表,不能直接转。303

相关软件下载。百度第一个。

2019-08-26_151006.jpg

2019-08-26_151101.jpg

回复 支持 反对

使用道具 举报

发表于 2019-8-25 18:21:56 | 显示全部楼层
学习,感谢楼主

[micropython_python]黑白BMP图取模转为十六进制数组:

https://www.mydigit.cn/forum.php?mod=viewthread&tid=177574

回复 支持 反对

使用道具 举报

发表于 2019-8-25 21:52:22 | 显示全部楼层
很不错啊,学习下。
回复 支持 反对

使用道具 举报

发表于 2019-8-25 22:39:00 | 显示全部楼层
能把PCtoLCD2002传一份吗
回复 支持 反对

使用道具 举报

发表于 2019-8-26 12:51:40 | 显示全部楼层
太厉害了没看懂,用python脚本分步导汉字txt到PCtoLCD2002里,转成库文件?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-26 15:09:04 | 显示全部楼层
infozx 发表于 2019-8-26 12:51
太厉害了没看懂,用python脚本分步导汉字txt到PCtoLCD2002里,转成库文件?

是用Python生成一个文本文件,就是附件里那个。

0x 08 40---------》0x fe fe  按这个顺序,将对应的文字找出来写到一个txt文本中。再用这个文本文件生成字库。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-26 15:24:53 | 显示全部楼层
wc5095928 发表于 2019-8-25 22:39
能把PCtoLCD2002传一份吗

软件下载。百度第一个。
回复 支持 反对

使用道具 举报

发表于 2019-8-28 01:19:15 | 显示全部楼层
楼主这是深度基础研究啊!
回复 支持 反对

使用道具 举报

发表于 2019-8-28 11:21:11 | 显示全部楼层
其实有专门的字库生成软件 的  .
原子的资料包里就有..
回复 支持 反对

使用道具 举报

发表于 2019-8-29 11:27:24 | 显示全部楼层
不知道你说的本文件如何任意生成各种字库,51如何调用
回复 支持 反对

使用道具 举报

发表于 2019-9-2 09:05:25 | 显示全部楼层
谢谢 楼主,留着学习
回复 支持 反对

使用道具 举报

发表于 2019-9-2 22:47:54 | 显示全部楼层
搞那么复杂干嘛,直接吧DOS时代的UCDOS的字库写入,然后使用就行了。
回复 支持 反对

使用道具 举报

发表于 2019-10-2 16:28:07 | 显示全部楼层
因为第一汉字  啊  的GBK码是  0x8140,所以每个汉字GBK码 高位-0x81  低位-0x40,因为每一区位的汉字有 12*16-1=191个,所以汉字位置编号是
AB = GBK_高2位字节-0x81           #第一个汉字  81  40
CD = GBK_低2位字节-0x40
offset = AB*(191)+CD                    #每个区191个汉字

我查到的“啊”编码不是0x8140,哪个才是对的?
GBK编码:B0A1
对应字符:啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-2 20:37:09 | 显示全部楼层
本帖最后由 lyy-cy 于 2019-10-2 20:38 编辑
彭大伟 发表于 2019-10-2 16:28
我查到的“啊”编码不是0x8140,哪个才是对的?
GBK编码:B0A1
对应字符:啊 ...

GBK编码:8140
对应字符:丂GB2312编码:没有BIG5编码:没有GB18030编码:8140Unicode编码:4E02

GBK编码:b0a1
对应字符:啊GB2312编码:B0A1BIG5编码:B0DAGB18030编码:B0A1Unicode编码:554A


https://www.qqxiuzi.cn/bianma/zifuji.php

GBK         的第一个汉字是    丂
GB2312   的第一个汉字是    啊


帖子的第一张图,可以说明。
回复 支持 反对

使用道具 举报

发表于 2020-6-4 15:27:41 | 显示全部楼层
00000000000000000000000000000000000000000000
回复 支持 反对

使用道具 举报

发表于 2020-6-4 18:11:40 | 显示全部楼层
这个方法好麻烦,很更简单的方法,完整GBK字库用TS4.exe生成,ASCII字库用CharacterMatrix 3.0.2.3 单文件完美破解版.exe生成。
如果汉字用的不多可以只做用到的汉字,用LcmZimo.exe。
TS4.exe和LcmZimo.exe也可以生成ASCII字模,但是有些字体看起来太丑了,没有CharacterMatrix 3.0.2.3 单文件完美破解版.exe生成的ASCII字模好看。
CharacterMatrix 3.0.2.3 单文件完美破解版.exe也可以生成GBK字库,只是感觉没有TS4.exe生成的字库好用。
回复 支持 反对

使用道具 举报

发表于 2020-6-4 21:17:36 | 显示全部楼层
我是用TS4.exe生成字库文件的,用电脑串口软件UartAssist.exe通过单片机串口写入W25Q*的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-26 21:04 , Processed in 0.140401 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表