一个适合用LCD12864的繁体中文取码工具,支持选择简体字对应的繁体字,支持半角自动转全角
起因
最近又双叒叕开始折腾单片机了,翻出了前两年购买的LCD12864模块。当初买的是带简体中文的版本,拿来一看,上面豁然写着繁体中文。算了,买都买了,也这么久了,将就用吧。
根据网上查找的资料,很快就在ESP32上驱动起来了,是跟示例中简体中文八杆子打不着的繁体中文。那就开始折腾吧。折腾的第一步,就是查找繁体中文对应的码表。
查找码表
尝试1
直接百度搜索”12864 繁体 码表“,无结果。。。
尝试2
由于繁体中文一般是big5编码。百度搜索 ”12864 big5 码表“,无结果。。。
尝试3
咨询卖家有没有繁体中文的码表,卖家联系厂家之后表示没有
尝试4
算了,不用百度,直接使用垂直类网站。在立创商城在搜索”12864 中文“,打开编号为C2939934商品的数据手册,在其中第二页写着:
ST7920-0A 内建 BIG-5 码繁体中文字型库
ST7920-0B 内建 GB 码简体中文字型库
嗯,有戏。我很快的把数据手册翻完了,然而遗憾的是,里面并没有码表。
成功
既然知道芯片名称,直接百度搜索”st7920 繁体 码表“吧。出来的第一个结果(精选)st7920繁体字库表(big5码) 看着就像那么回事,经过验证,不难发现,该码表适用于我的屏幕。
工具编写
思路
虽然常用繁体字我差不多都能认识,但处于简体字环境中,还是以简查繁更友好。一个简体字有可能对应多个繁体字,在这种情况下应能允许用户自由选择使用哪个合适的繁体字。
码表预处理
- 在未注册账号的情况下,通过某些方法将码表复制并保存到一个文本文档中(ST9260繁体)。出于支持正版的考虑,这些技巧就不分享了。
- 将上述文本文档复制到WORD中,并通过其繁转简功能转化为简体,保存到另一个文档中(ST9260繁转简)。
V1.0实现
完成了预处理,使用C#+WPF,1.0版本很快就完成了。代码不多,也就不搞什么MVVM。其中使用了两个字典:
- 一个字典保存简体中文和其对应的繁体中文编码(一个简体中文可对应多个繁体中文编码)
- 另一个字典保存繁体中文编码和其对应的繁体中文字符
转换过程就是在两个字典之间查找并展示。
将该工具投入使用,很快便发现了两个问题。
字符集中不包含字符
在查询语句中包含某些字符时提示字符集中不包含(如天地)。
仔细一看,码表中存在这些字符。
使用Notepad Next打开复制下来的文本文档(ST9260繁体),发现对应的字符处都是黑框。
再使用Windows自带记事本打开刚才的文本文档,发现对应的字符是显示的,只是明显偏小偏上,看着比较像上标。
通过在网上查询,果然是中文上标。常用的如: ㆒㆓㆔㆕㆖㆗㆘㆙㆚㆛㆜㆝㆞㆟。
知道了原因,问题也好解决,将对应处的字符手动改写即可。
显示字符有偏差
在使用生成的编码显示某些字符时(如言),显示的却是另外一个字符(如谷)。
根据码表手动查找代码并显示(A8A5),发现能正常展示。
而工具生成的代码为A8A4,提前了一位,那应该是文本文档(ST9260繁体)有问题,打开文档一看:
我空格呢,我那么大一个空格?个人猜测是在复制时浏览器将多个空格视作了一个空格。
粗看一下码表,不难发现,每个低位为A0的行行首都有一个空格。通过文本框的替换功能在文本文档(ST9260繁体)中对应的每行前面加上一个空格,问题解决。
半角到全角的转换
根据修改好文本文档(ST9260繁体)更新对应的繁转简文档(ST9260繁转简)。再次运行,经过几次测试,发现中文都能正确的展示。但是在查询语句中包含英文或者数字时如(ST9260繁转简),照样会提示字符集中不包含。
这是因为码表中的字母、数字、符号都是全角字符。而绝大多数时间,我们都是使用半角的英文和数字。半角情况下,显示宽度只有全角的一半,以ST9260为例,其对应的全角状态为:ST7920。
在LCD12864中,可以全角半角同时显示,但是将一段完整的话分成几截来显示也挺恶心的。为了便于使用,不妨给工具加上半角自动转全角的功能。
半角和全角可以通过在线工具进行转换,将我们日常使用的半角字母、数字、符号合并为一个字符串1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~!@#$%^&*()-=_+[]{}\\|;:'\",./<>? 。输入到在线工具中,点击半角转全角即可得到全角字符串。
在代码中根据两个字符串生成一个字典,很容易就能实现半角自动转全角的功能。
在这里还有一个特殊的字符,即空格。在前面的半角字符串中最后一个字符就是空格。在码表中,我们很难看出来具体哪一个字符是对应的全角空格。仔细分析码表的结构,我们可以发现如下特征:
- A3C0-A3F0为空,猜测为符号与汉字的分隔区。
- C6A0-C8F0为空,猜测为常见汉字与不常见汉字的分隔区。
- 每个低位为70和F0的行行尾都有一个空格。
- 每个低位为A0的行行首前面都有一个空格。这点我们已在前文提到过。
除此之外,还有一个特例,码表的第一行(A140那一行),也是以一个空格开始的。因此盲猜A140就是中文空格,经过验证,确实如此。修改ST9260繁体和ST9260繁转简这两个文本文档,在第一行编码后面加上全角空格。
再多说一句,在html中,半角空格为  ,全角空格为 。
2.0
至此,工具完成,效果图如下:
参考链接
HS12864-15C_(HS(汉昇))HS12864-15C中文资料_价格_PDF手册-立创电子商城
字母及数字上标下标