一直以来,我对仓颉和速成这对难兄难弟是很有意见的……网上流传的码表版本繁多,但名字都叫“仓颉”,和五笔对比起来,好歹五笔还分个 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 中文标准全字库生成仓颉和速成官方码表