爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
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编码没有对应的汉字,所以只要解码不成功,用一个‘□’占位就可以了,这样也不改变,汉字的排列顺序。 GB2312和GBK都是能用汉字编码解读出汉字排列顺序的,只要有正确的汉字排列顺序文本,就可以任意生成符合规范的点阵字库。 首先写个程序生成左边的那个文本,为了方便观看加上了回车,但是真正要做字库的时候要去掉回车空行。 - # 生成GBK字库文本
- GBK_file_path = r'GBK字库文本.txt'
- gb_txt_file = open(GBK_file_path,'w',encoding='gbk') #这个是包含所有gb2312文字的txt
- for GBK_H in range(0x81,0xff):
- for GBK_L in range(0x40,0xff):
- GBK_CODE_H = GBK_H.to_bytes(1,"big") # 拼接成 bytes
- GBK_CODE_L = GBK_L.to_bytes(1,"big") # 拼接成 bytes
- GBK_CODE = GBK_CODE_H + GBK_CODE_L # 拼接成 bytes
- txt_char = GBK_CODE.decode('gbk')
- gb_txt_file.write(txt_char)
- gb_txt_file.close()
复制代码上面的代码就是两个循环,Python写的,生成一个txt文件。这文件后面有下载。
三、生成字库 先确认取模方式,看懂这个图就可以了。 开始操作(下面这个软件,基本上大家都有)
使用也是异常简单: - 因为第一汉字 啊 的GBK码是 0x8140,所以每个汉字GBK码 高位-0x81 低位-0x40,因为每一区位的汉字有 12*16-1=191个,所以汉字位置编号是
- AB = GBK_高2位字节-0x81 #第一个汉字 81 40
- CD = GBK_低2位字节-0x40
- offset = AB*(191)+CD #每个区191个汉字
复制代码
四、软件验证 完全符合 五、硬件验证 生成了一个40x48的宋体加粗GBK字库。用编码器写入
点击下面图片可以看到视频。
最后这个文本文件大家下载回去后就可任意生成各种字库了。 前后折腾了两天才完全搞定,希望大家多多下载,挣点M。
GBK字库文本.rar
(983 Bytes, 下载次数: 26)
总结:ascll、GB2312和GBK点阵字库就是按编码顺序把汉字点阵取模的数值依次存储。用的时候根据前面规则求出顺序位置,读出一组数值。关键是:顺序、位置。
|