形码众多,走马观花管中窥豹,总结下形码输入法(或曰形码输入方案)的创建和维护过程。

字根选取

Unicode 15.1 收录了约 10 万 CJKV 汉字,教育部、国家语委组织研制了《通用规范汉字表》收录了 8105 汉字,按照 CHISE IDS 的 IDS-UCS-* 的汉字拆分算,有 2000 多的「独体字」,其它汉字可以用它们复合而成。从几个大字集输入方案的字根数量看:

可以看到字根的选取弹性很大,毕竟形码输入法极端简化就是五笔画输入法,只需要横竖撇点折五个字根,极端繁复就是用 2000 多的「独体字」做字根,这里引入两个概念:

  • 原始字根:指没有形变的汉字笔画(比如几十种折笔),部首或者独体字(比如足、⻊、金、钅、口、木),以及为了减少拆字细碎的难度、减少重码而引入的「大字根」(比如𣎆、車、鬼),原始字根大约在 1000 多 个。由于有的字根并没被收录进 Unicode 标准,因此常用 {卬左} 或者 &NNNN; 这样的记号;

  • 形近归并字根,简称归并字根:为了减少记忆难度、拆字难度, 将形状相近的字根合并,比如将几十种折笔合并成三四种,将「足」、「⻊」合并为「足」。归并字根的数量一般在 200 ~ 500 个,字根太多显然记忆困难,字根太少则拆字细碎、原始重码率增加,也不好。注意在归并字根时不要把形近但是笔画数目不同的原始字根归并成同一个字根,以免用户在拆字时混淆笔画,比如「虎」「虍」{虍头}(虍无七),比如「豕」{豕下}(豕无横),这些字根可以在编码时赋与相同的码,以便于记忆。

汉字拆分

有了字根后,就可以按照一定规则来拆分汉字为字根序列了。拆分规则的讲究很多,可以参考宇浩输入法自动拆分系统,拆分是个体力活,一般会使用递进拆分或者说递归拆分来简化,也就是说复合字只用拆分到组成它的汉字即可,不必拆分到字根序列,而把那些组成汉字拆分到字根序列,这样简化下来,10 万汉字大约有 2000 ~ 3000 个是需要手动拆分的。CHISE IDS 的汉字拆分就是采用的递进拆分方式来维护。

由于同一个 Unicode 字符可能对应中国大陆、港澳台、日韩越的不同字形,以及为了照顾用户对「直观拆分」的不同理解、不同字体的造型,所以同一个汉字可能有多个拆分。

字根编码

字根有用一个英文字母表示的单编方式,如经典的王码五笔,也有用两个字母表示的双编方式,双编的第一个字母叫大码,第二个字母叫小码。单编易学,双编重码低,目前新的形码方案倾向于双编。从字根映射到编码也有很多讲究:

  • 是否按字根的起始笔画分区排布在键盘上?分区显然更易记,但也限制了字根排列灵活降低重码的腾挪空间;

  • 字根的形状、意义、读音是否和编码的字母有关系?三者称为字根的形托、义托、音托,显然这样做也是为了易记;

  • 字根在键盘上的排布除了要尽量分散降低重码,也要注意手感,比如高频字根不要安排到 Q/Z/P 这些难按的键上,比如一个汉字或者词组的编码序列不要落在同一只手甚至同一根手指上;

  • 字根是映射 26 个字母还是25 个字母(五笔的习惯,留 Z 键做反查等其它用途),甚至映射到标点符号键。映射到更多键有利于降低重码,但也不利于用在手机的小键盘上;

字词取码和编码

不同形码输入方案的取码和编码的规则有简单也有复杂,参考常见形码输入方案编码规则宇浩输入法设计哲学, 根据拆分表、字根编码表、取码和编码规则就可以生成最终用户使用的码表了。

总结

  1. 打造一款形码,工作量主要在于汉字拆分和字根编码,前者主要是体力活,后者则考验计算机算法和编程能力;

  2. 维护形码过程中用到的数据表:

    • 字根表:用 Unicode 字符、 {XX}、 &NNNN; 记号标记的原始字根作为主键,记录其归并到哪个归并字根,映射到什么键盘编码,映射到什么 Unicode PUA 字符以使用私用字体渲染字根,注意同一个 PUA 字符不要映射到多个字根,对于非常相似的字根,可以在 PUA 字体文件里让多个 PUA 字符共用一个 glyph;

    • 递进拆分表:以 Unicode 汉字编码为主键,记录其不同区域的拆分以及照顾用户和字体的兼容拆分,这张表是形码方案的核心资产;这张表最好使用原始字根做拆分,以方便修改字根归并时不必重新花费体力做汉字拆分;

    • 平铺拆分表,简称拆分表:从递进拆分表生成;

    • 码表:根据字词的取码、编码规则,从字根表和拆分表生成;

最终用户必不可少的表是字根表(一般以字根图形式提供)和码表,为了方便用户理解拆分,有的输入方案也公开平铺拆分表,而公开递进拆分表的方案就很少了,目前只知道有天码。字根表和拆分表一般只公开归并字根版本或者 PUA 字符版本,不便于其它形码复用,有点可惜。