从 cns11643 中文标准全字库生成仓颉和速成官方码表

一直以来,我对仓颉速成这对难兄难弟是很有意见的……网上流传的码表版本繁多,但名字都叫“仓颉”,和五笔对比起来,好歹五笔还分个 86 和 98,再新一点还有 新世纪 等等,但仓颉没有,不论什么版本的仓颉,都叫“仓颉”。

这就很尴尬,每个人用的仓颉码表都不一样,但不一样在哪里,他自己也不知道。

总之, 全字库(cns11643) 提供了一种官方的通用的中文编码,本来这个东西是用来弥补 utf8 之类对中文表达能力不足的,就像 gb18030,不过有趣的是它的数据包里还包含了仓颉编码,中文发音、偏旁部首、笔画数量、笔画过程等等数据,所以拿来生成的仓颉码表,应该算是“官方”码表了吧。

转码

下载后数据包中都有说明,找到 Open_Data/MapingTables/Unicode 目录,里边有三个编码映射文件,我们需要先把编码映射字典处理出来,不然直接用全字库编码是人类不可读的。

比如这样:

编码很简单,全字库编码对应 unicode 编码,我们只需要将对应的 unicode 编码转换成人类可读的文字即可,关键语句如下(Python 3):

这里注意第五行,我们给 unicode 码前加入 \u 前缀,让他变成一个 unicode 的 escape,然后所有的 unicode 编码规则的字符串就转换成了“\uffff”的形状,接下来把字符串 encode 成二进制,再用 unicode 解码即可生成人类可读的中文字符了。

生成后就是如下样子:

当然,也包含了这个样子:

这些是因为全字库的文本范围比 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

About the Author

R0uter

如非声明,本人所著文章均为原创手打,转载请注明本页面链接和我的名字。

Comments

  1. 好久以前就看到这篇,最近下来比对了下,他们这套数据确实全,单从收字数数据来看比就rime-cangjie多收了2万条左右,但是有比较严重的二、三代编码遗留,对习惯五代码的人来说不友好。去除冗余的BMP CJK兼容形式以后,感觉可以用来补一补rime-cangjie的潜在缺码。

    现在大陆的民间的cangjie用户基本都跑到rime阵营了,算是目前唯一相对活跃维护的开源仓颉输入法解决方案吧。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注