可搜索,可注册,可登录,致敬逗比大佬!尽在救援版逗比根据地 dbgjd.com
投稿文章 | 广告合作 | Telegram 群组 / 公告频道 / 使用教程

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

News 转载自https://www.logcg.com 607℃ 0评论
最近更新:16th 五月, 2019

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

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

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

转码

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

比如这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
15604E 455C
15607A 4787
156133 93B9
156143 93BF
156172 9BCF
156177 9D64
15617C 9EBF
156253 3C07
156278 3F05
15627B 3F06
15636E 45F9
156377 89B8
156434 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
14546F
145470
145471
145472
145473
145474
145475
145476
145477
145478
145479

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

1
2
3
4
5
6
7
8
9
10
11
14237A C
142422 8
14242B 5
14242E 4
142430 2
142432 1
14243A 0
14243B F
14243C E
14243D D
14243E C

这些是因为全字库的文本范围比 utf8 表达的范围大导致的,你无法在普通设备上看到这些文字,所以就显示成乱码了。总之,我们也不需要这些字,毕竟大部分设备上也无法显示,简单来说,直接判断字符数量,超过1就跳过就行了。

速成

这样,我们就得到了全字库对应中文字符的表格,现在可以生成仓颉码表了,生成后有 9 万多字,但实际上能显示的还是 2 万左右,同样的道理,去掉无法表达的字符,剩下的就是“官方码表”了。

至于说速成,速成是仓颉的简化,基本规则就是仓颉编码超过两位则取头尾……

即 a→a、ab→ab、abc→ac、abcd→ad……以此类推。

这下,我们就得到了全字库速成和全字库仓颉码表。

授权

全字库是开放授权的,注明出处即可,参考授权声明。任何人都可以在开放平台下载这个字库。

参考文献

  • 全字库官网 https://www.cns11643.gov.tw

转载请注明:逗比根据地 » 从 cns11643 中文标准全字库生成仓颉和速成官方码表

喜欢 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址