一直以来,我对仓颉和速成这对难兄难弟是很有意见的……网上流传的码表版本繁多,但名字都叫“仓颉”,和五笔对比起来,好歹五笔还分个 86 和 98,再新一点还有 新世纪 等等,但仓颉没有,不论什么版本的仓颉,都叫“仓颉”。
这就很尴尬,每个人用的仓颉码表都不一样,但不一样在哪里,他自己也不知道。
总之, 全字库(cns11643) 提供了一种官方的通用的中文编码,本来这个东西是用来弥补 utf8 之类对中文表达能力不足的,就像 gb18030,不过有趣的是它的数据包里还包含了仓颉编码,中文发音、偏旁部首、笔画数量、笔画过程等等数据,所以拿来生成的仓颉码表,应该算是“官方”码表了吧。
转码
下载后数据包中都有说明,找到 Open_Data/MapingTables/Unicode 目录,里边有三个编码映射文件,我们需要先把编码映射字典处理出来,不然直接用全字库编码是人类不可读的。
比如这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
15-604E 455C 15-607A 4787 15-6133 93B9 15-6143 93BF 15-6172 9BCF 15-6177 9D64 15-617C 9EBF 15-6253 3C07 15-6278 3F05 15-627B 3F06 15-636E 45F9 15-6377 89B8 15-6434 4953 |
编码很简单,全字库编码对应 unicode 编码,我们只需要将对应的 unicode 编码转换成人类可读的文字即可,关键语句如下(Python 3):
1 2 3 4 5 6 |
for line in file.readlines(): line = line.strip() first,last = line.split('\t') last = ('\\u'+last).encode().decode('unicode-escape') target.write('{}\t{}\n'.format(first,last)) |
这里注意第五行,我们给 unicode 码前加入 \u 前缀,让他变成一个 unicode 的 escape,然后所有的 unicode 编码规则的字符串就转换成了“\uffff”的形状,接下来把字符串 encode 成二进制,再用 unicode 解码即可生成人类可读的中文字符了。
生成后就是如下样子:
1 2 3 4 5 6 7 8 9 10 11 |
14-546F 恸 14-5470 恹 14-5471 恺 14-5472 恻 14-5473 恽 14-5474 㦳 14-5475 㧛 14-5476 㧝 14-5477 挘 14-5478 挜 14-5479 挝 |
当然,也包含了这个样子:
1 2 3 4 5 6 7 8 9 10 11 |
14-237A ﯪC 14-2422 ﯪ8 14-242B ﯪ5 14-242E ﯪ4 14-2430 ﯪ2 14-2432 ﯪ1 14-243A ﯪ0 14-243B ﯩF 14-243C ﯩE 14-243D ﯩD 14-243E ﯩC |
这些是因为全字库的文本范围比 utf8 表达的范围大导致的,你无法在普通设备上看到这些文字,所以就显示成乱码了。总之,我们也不需要这些字,毕竟大部分设备上也无法显示,简单来说,直接判断字符数量,超过1就跳过就行了。
速成
这样,我们就得到了全字库对应中文字符的表格,现在可以生成仓颉码表了,生成后有 9 万多字,但实际上能显示的还是 2 万左右,同样的道理,去掉无法表达的字符,剩下的就是“官方码表”了。
至于说速成,速成是仓颉的简化,基本规则就是仓颉编码超过两位则取头尾……
即 a→a、ab→ab、abc→ac、abcd→ad……以此类推。
这下,我们就得到了全字库速成和全字库仓颉码表。
授权
全字库是开放授权的,注明出处即可,参考授权声明。任何人都可以在开放平台下载这个字库。
参考文献
- 全字库官网 https://www.cns11643.gov.tw
本文由 落格博客 原创撰写:落格博客 » 从 cns11643 中文标准全字库生成仓颉和速成官方码表
转载请保留出处和原文链接:https://www.logcg.com/archives/3211.html
好久以前就看到这篇,最近下来比对了下,他们这套数据确实全,单从收字数数据来看比就rime-cangjie多收了2万条左右,但是有比较严重的二、三代编码遗留,对习惯五代码的人来说不友好。去除冗余的BMP CJK兼容形式以后,感觉可以用来补一补rime-cangjie的潜在缺码。
现在大陆的民间的cangjie用户基本都跑到rime阵营了,算是目前唯一相对活跃维护的开源仓颉输入法解决方案吧。