一直以來,我對倉頡和速成這對難兄難弟是很有意見的……網上流傳的碼表版本繁多,但名字都叫“倉頡”,和五筆對比起來,好歹五筆還分個 86 和 98,再新一點還有 新世紀 等等,但倉頡沒有,不論什麼版本的倉頡,都叫“倉頡”。
這就很尷尬,每個人用的倉頡碼表都不一樣,但不一樣在哪裡,他自己也不知道。
總之, 全字庫(cns11643) 提供了一種官方的通用的中文編碼,本來這個東西是用來彌補 utf8 之類對中文表達能力不足的,就像 gb18030,不過有趣的是它的數據包裡還包含了倉頡編碼,中文發音、偏旁部首、筆劃數量、筆劃過程等等數據,所以拿來生成的倉頡碼表,應該算是“官方”碼表了吧。
轉碼
下載後數據包中都有說明,找到 OPEN_DATA/Napidagtbles/統一 目錄,裡邊有三個編碼映射文件,我們需要先把編碼映射字典處理出來,不然直接用全字庫編碼是人類不可讀的。
比如這樣:
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陣營了,算是目前唯一相對活躍維護的開源倉頡輸入法解決方案吧。