Skip to content

宇浩输入法设计哲学

初衷

2021年底,我开始用中国大陆《古籍通规》标准的繁体字创作一部长篇小说。小说中有大量的文言段落、文白夹杂的对话,以及诗词。因此,我发现重码太高的拼音输入法无法满足我的需求。我急需一款能够具有高度确定性的输入法。

我之前使用过五笔字形,但它是对于简体优化的,字根太散,不适用于繁体输入。仓颉输入法虽是繁简通打,但它是五码定长,没有简码和词语输入,适合检字,但不适合打字,也被排除。之后我又了解了郑码,发现它虽然字根分布有规律,但全简不一致,且在繁体字集上的重码和五笔其实没有多少区别。再后来,我了解到三码郑码,喜欢它规则的简单,但它只适合简体字集,繁体输入需要转换,所以不满足我的需求。最后,我了解到了徐码输入法,它的繁简通打的特性十分吸引人,并且在简、繁、简繁混输的场合下,徐码的重码都是最低的。

综合比较各个输入法的重码,和各方面的情况。我意识到,如果需要繁体输入,选项只剩下了徐码和仓颉。因为仓颉不是四码定长,最终我选择了徐码。

在一年多的使用中,我用徐码打了近百万字的繁体小说,日常生活也用它的简体输入,享受了他的低重码、繁简通的特点,也感受到了它取回头码、Z键频率太高的不便之处。这一年里,我还拆分了CJK的全部汉字,了解了其它的新的输入法,对评价输入法各个维度有了更深入的了解,慢慢,明白了自己到底需要什么。最重要的三个心得是:

  1. 键盘派和字典派的区别。键盘派,希望字根分布按照键盘分区,上手容易;相对的,字典派的字根分布使用字典顺序,在键盘上显得反而成了乱序。
  2. 频率派和低重派的区别。低重派,目标是一字一码,尽可能在大字集上低重,注重大字集静态重码;频率派,目标是在常用字集上低重,将字的权重纳考量,注重常用字集动态重码。
  3. 字根派和规则派的区别。字根派,目标是通过字根的分布,有时候加以乱序,来减少重码。规则派,目标是通过规则的复杂度来减少重码。

在使用形码创作的过程中,我发现我是一个键盘派,一个频率派,一个字根派:

  1. 我希望同笔画的字根在键盘上集中分布。
  2. 我还希望在常用繁简汉字(10000个左右)上减少选字的频率。而在大字集上,我不追求极端低重,而是以方便检字为宗旨,例如,「虎字头」在大字集中有若干变化形态,如果我们将它们拆得太细,的确会减少重码候选,但同时我们也很容易查不到字,不如将所有的变形全部视为「虎字头」,虽然重码候选增加,但检索起来更加快捷。
  3. 我更希望规则上不要太复杂,防止打字的时候思路被打断,比如判断主副根、判断取不取次末根、字的结构是上下还是左右等。

因此,我制作了这款新输入法,我的初衷是:世面上的输入法都有自己的优点,但也有自己的痛处。优点和缺点都比较极端。我的目标是将其它输入法的主要痛点加以避开或减轻,同时尽量保持其优势。追求平衡感,包括:

  • 避免五笔的结构码,但发挥它字根按键盘分区的优势。
  • 避免郑码的全简不一致,但发挥它双编码的特征。
  • 避免徐码的取回头码的特点,但发挥它繁简通打的优势。
  • 避免乱序字根,但发挥它规则简单和动态重码低的优势。
  • 避免郑码、徐码判断取两根还是三根的问题,以及取倒数第二根的特点。
  • 避免徐码Z键频率过重的特点,发挥五笔不用Z键的优势,以及它的手感(按键频率向中间靠拢)。

根据以上目标,我在常用繁简字集上(GB2312 + 国字常用字 + 大陆繁体字形)进行了优化,同时考虑了静态重码和动态重码。最后,它便形成了「宇浩输入法」。它在各方面的指标都都达到了一种平衡。

这里总结一下「宇浩输入法」对若干痛点的解决方法:

  • 宇浩输入法使用了和五笔一样的分键盘区域随机排布字根的方式。横区在键盘中排左侧,竖区在键盘中下排右侧,撇区在键盘上排左侧,捺区在键盘上排右侧,折区在键盘下排左侧。字根较为随机,这个考量是为了降重,同时不增加规则的复杂度。实际使用的时候,字根可以短时间内熟练,但规则的复杂度带来的痛苦是长久的。分区域分布,这是为了降低使用者上手的困难度。
  • 宇浩输入法部分借鉴了徐码的首根小码后置(回头码)的特点,但徐码的副根字无论在任何情况下都要回头,这等同于在输入单字的时候一直判断取三根还是四根,容易出错。宇浩输入法只有在编码不足四码(双根字)的情况下才需要补上首根小码。
  • 宇浩输入法使用了和五笔一样取一二三末根。而不是郑码和徐码那样,有时候取一、二、次末、末,有时候取一二末。这样选择,是因为倒数第二根的判断比较困难,打字的时候容易卡壳。

评价输入法各个维度的讨论

这一章我讨论评价一款输入法的各个维度,引出我制作这个输入法的动机和目标。

关于重码

本着实用主义现实主义原则,我将汉字的输入分为打字和检字两部分:

  • 打字,指的是对于常用字的输入。这要求确定性,保证在最常见8000个繁简汉字混合状态下,大多数码位不存在重码字,可以进行盲打。如果有重码,也可以通过简码规避。
  • 检字,指的是生僻字输入,要求输入方案提供包括CJK的全部汉字。这部分的输入不需要过分追求低重码,因为对于一个生僻字,就算输入法低重,你也肯定要看一下屏幕进行确认。相反地,应该以便捷为主,部首的变化形态应当进行归并,而不是为了规避重码而强行分开。当然,尽量保证 GBK 字集下单个码位的重码数量不超过5个,防止过度翻页。

基于这个理念,我的目标是:

  1. 常用繁简通字集上低重:GB2312和通规共有字 + 国字常用字 + 大陆古籍规范汉字常用字。繁简联合 < 1000 个重码字,繁简联合动态重码率 < 0.20%
  2. 简化字字集低重:GB2312 ~ 300 个重码字,动态重码率 < 0.10%
  3. 繁体字字集低重:国字常用字 ~ 200 个重码字,动态重码率 < 0.15%
  4. 大字集:GBK 字集重码字 ~ 5000
  5. 部分有若干形态的部首进行归并。

关于编码规则

编码的规则应该足够简单和直观,避免太多的判断和回改。以下是关于编码规则的部分偏好:

  • 字根取一、二、三、末,优于取一、二、次末、末。这是因为倒数第二根需要进行一些判断,不够直观。
  • 字根分开,不如字根靠拢。举例为,「襄」拆成「衣口口一龷」,不如「亠口口一龷𧘇」直观。「衍」拆成「行氵」不如「彳氵亍」直观。
  • 字根是独体,胜过字根是其他字根的组合。避免音,比,羽等字根,这样会造成判断上的困难。如果有,也应当尽量让它们的大码相同。如,髟、镸、长的大码应该在同一个位置上。
  • 分主副根,不如不分。因为主副根需要进行一次判断,以决定到底第三个根取「次末」还是「末」。
  • 无结构码,比有结构码好。因为结构码需要判断字的构架。
  • 首根小码不后置,比后置好。因为后置首根小码,会挤占一个主根的大码或末根的小码,如果判断首根失误,会造成回改。

对于编码规则,一个从容易到困难的排序是:

  1. 只用大码(呒虾米)
  2. 无结构码和首根小码
  3. 无结构码,首根小码只在不足四码时使用(宇浩)
  4. 分为取三根和四根,首根小码紧跟首根大码(郑码)
  5. 结构码(五笔)
  6. 分为取三根和四根,首根小码后置占位(徐码)

我的方案采取第二种,这是因为首根小码可以允许繁简通打,如果完全不加,那么即使在GB2312下重码也非常高。

宇浩输入法的规则如下:

  • 取一、二、三、末根大码
  • 不足四码时,补上末根小码
  • 仍然不足四码时,补上首根小码(如果是v不用补)

关于字根分布

对于字根分布,有几个维度。一者,字根是否按横竖撇捺分区排布;二者,一个键上的字根是否具有相似的属性;三者,是按照键盘分区(打字主义,单映射),还是按字母表分区(检字主义,双映射);四者,如果有小码,小码是如何决定的。

目前的常见输入法,一个从容易到困难的排序是:

  1. 字根大码按键盘分大区,大区内比较乱序。字根无小码。(五笔)
  2. 字根大码按字母分大区,大区内完全有字形规律。字根小码用字形提示。(郑码)
  3. 字根大码按字母分大区,大区内比较有字形规律。字根小码用拼音提示。(徐码)
  4. 字根大码完全乱序,小码用拼音提示。

宇浩输入法的字根排布,融合了五笔和徐码的特点。

  • 大码按键盘分大区。(分区上YHN三键和五笔不同)
  • 大区内比较乱序。
  • 字根小码用拼音提示。(某些字根用v键)

关于拆分规则

优先级:

少 顺 散 连 交 断 美 大

直观的意思:

  • 包围不拆散,比如昜。
  • 竖变斜是变形。

变形幅度在直观的范围内。这一点无法完全量化,毕竟文字是艺术。所以,我也增加了地区字形兼容码。

字形

某些字形在常用字集内没有区分,或者共用 Unicode 码位。真正的字形区分往往在 CJK 拓展区,属于检字范畴。为了不增加判断难度,因此:

  • 冫和ㄑ都拆成二
  • 日曰除却「曰汩㫚」外都一并为「日」
  • 木朩𣎳字源不同,但已经混同,术术亦同。故而不作区分。

宇浩输入法官网