宇浩輸入法設計哲學
初衷
2021年底,我开始用中國大陸《古籍通規》標準的繁體字創作一部長篇小説。小説中有大量的文言段落、文白夾雜的對話,以及詩詞。因此,我發現重碼太高的拼音輸入法無法滿足我的需求。我急需一款能够具有高度確定性的輸入法。
我之前使用過五筆字形,但它是對於簡體優化的,字根太散,不適用於繁體輸入。倉頡輸入法雖是繁簡通打,但它是五碼定長,没有簡碼和詞語輸入,適合檢字,但不適合打字,也被排除。之後我又瞭解了鄭碼,發現它雖然字根分佈有規律,但全簡不一致,且在繁體字集上的重碼和五筆其實没有多少區别。再後來,我瞭解到三碼鄭碼,喜歡它規則的簡單,但它只適合簡體字集,繁體輸入需要轉換,所以不滿足我的需求。最後,我瞭解到了徐碼輸入法,它的繁簡通打的特性十分吸引人,並且在簡、繁、簡繁混輸的場合下,徐碼的重碼都是最低的。
綜合比較各個輸入法的重碼,和各方面的情况。我意識到,如果需要繁體輸入,選項只剩下了徐碼和倉頡。因爲倉頡不是四碼定長,最終我選擇了徐碼。
在一年多的使用中,我用徐碼打了近百萬字的繁體小説,日常生活也用它的簡體輸入,享受了他的低重碼、繁簡通的特點,也感受到了它取回頭碼、Z鍵頻率太高的不便之處。這一年裏,我還拆分了CJK的全部漢字,瞭解了其它的新的輸入法,對評價輸入法各個維度有了更深入的瞭解,慢慢,明白了自己到底需要什麽。最重要的三個心得是:
- 鍵盤派和字典派的區别。鍵盤派,希望字根分佈按照鍵盤分區,上手容易;相對的,字典派的字根分佈使用字典順序,在鍵盤上顯得反而成了亂序。
- 頻率派和低重派的區别。低重派,目標是一字一碼,儘可能在大字集上低重,注重大字集靜態重碼;頻率派,目標是在常用字集上低重,將字的權重納考量,注重常用字集動態重碼。
- 字根派和規則派的區别。字根派,目標是通過字根的分佈,有時候加以亂序,來減少重碼。規則派,目標是通過規則的複雜度來減少重碼。
在使用形碼創作的過程中,我發現我是一個鍵盤派,一個頻率派,一個字根派:
- 我希望同筆畫的字根在鍵盤上集中分佈。
- 我還希望在常用繁簡漢字(10000個左右)上減少選字的頻率。而在大字集上,我不追求極端低重,而是以方便檢字爲宗旨,例如,「虎字頭」在大字集中有若干變化形態,如果我們將它們拆得太細,的確會減少重碼候選,但同時我們也很容易查不到字,不如將所有的變形全部視爲「虎字頭」,雖然重碼候選增加,但檢索起來更加快捷。
- 我更希望規則上不要太複雜,防止打字的時候思路被打斷,比如判斷主副根、判斷取不取次末根、字的結構是上下還是左右等。
因此,我製作了這款新輸入法,我的初衷是:世面上的輸入法都有自己的優點,但也有自己的痛處。優點和缺點都比較極端。我的目標是將其它輸入法的主要痛點加以避開或減輕,同時儘量保持其優勢。追求平衡感,包括:
- 避免五筆的結構碼,但發揮它字根按鍵盤分區的優勢。
- 避免鄭碼的全簡不一致,但發揮它雙編碼的特徵。
- 避免徐碼的取回頭碼的特點,但發揮它繁簡通打的優勢。
- 避免亂序字根,但發揮它規則簡單和動態重碼低的優勢。
- 避免鄭碼、徐碼判斷取兩根還是三根的問題,以及取倒數第二根的特點。
- 避免徐碼Z鍵頻率過重的特點,發揮五筆不用Z鍵的優勢,以及它的手感(按鍵頻率向中間靠攏)。
根據以上目標,我在常用繁簡字集上(GB2312 + 國字常用字 + 大陸繁體字形)進行了優化,同時考慮了靜態重碼和動態重碼。最後,它便形成了「宇浩輸入法」。它在各方面的指標都都達到了一種平衡。
这里总结一下「宇浩输入法」对若干痛点的解决方法:
- 宇浩输入法使用了和五笔一样的分键盘区域随机排布字根的方式。横区在键盘中排左侧,竖区在键盘中下排右侧,撇区在键盘上排左侧,捺区在键盘上排右侧,折区在键盘下排左侧。字根较为随机,这个考量是为了降重,同时不增加规则的复杂度。实际使用的时候,字根可以短时间内熟练,但规则的复杂度带来的痛苦是长久的。分区域分布,这是为了降低使用者上手的困难度。
- 宇浩输入法部分借鉴了徐码的首根小码后置(回头码)的特点,但徐码的副根字无论在任何情况下都要回头,这等同于在输入单字的时候一直判断取三根还是四根,容易出错。宇浩输入法只有在编码不足四码(双根字)的情况下才需要补上首根小码。
- 宇浩输入法使用了和五笔一样取一二三末根。而不是郑码和徐码那样,有时候取一、二、次末、末,有时候取一二末。这样选择,是因为倒数第二根的判断比较困难,打字的时候容易卡壳。
評價輸入法各個維度的討論
這一章我討論評價一款輸入法的各個維度,引出我製作這個輸入法的動機和目標。
關於重碼
本着實用主義和現實主義原則,我將漢字的輸入分爲打字和檢字兩部分:
- 打字,指的是對於常用字的輸入。這要求確定性,保證在最常見8000個繁簡漢字混合狀態下,大多數碼位不存在重碼字,可以進行盲打。如果有重碼,也可以通過簡碼規避。
- 檢字,指的是生僻字輸入,要求輸入方案提供包括CJK的全部漢字。這部分的輸入不需要過分追求低重碼,因爲對於一個生僻字,就算輸入法低重,你也肯定要看一下屏幕進行確認。相反地,應該以便捷爲主,部首的變化形態應當進行歸併,而不是爲了規避重碼而強行分開。當然,儘量保證 GBK 字集下單個碼位的重碼數量不超過5個,防止過度翻頁。
基於這個理念,我的目標是:
- 常用繁簡通字集上低重:GB2312和通規共有字 + 國字常用字 + 大陸古籍規範漢字常用字。繁簡聯合 < 1000 個重碼字,繁簡聯合動態重碼率 < 0.20%
- 簡化字字集低重:GB2312 ~ 300 個重碼字,動態重碼率 < 0.10%
- 繁體字字集低重:國字常用字 ~ 200 個重碼字,動態重碼率 < 0.15%
- 大字集:GBK 字集重碼字 ~ 5000
- 部分有若干形態的部首進行歸併。
關於編碼規則
編碼的規則應該足够簡單和直觀,避免太多的判斷和回改。以下是關於編碼規則的部分偏好:
- 字根取一、二、三、末,優於取一、二、次末、末。這是因爲倒數第二根需要進行一些判斷,不够直觀。
- 字根分開,不如字根靠攏。舉例爲,「襄」拆成「衣口口一龷」,不如「亠口口一龷𧘇」直觀。「衍」拆成「行氵」不如「彳氵亍」直觀。
- 字根是獨體,勝過字根是其他字根的組合。避免音,比,羽等字根,這樣會造成判斷上的困難。如果有,也應當儘量讓它們的大碼相同。如,髟、镸、長的大碼應該在同一個位置上。
- 分主副根,不如不分。因爲主副根需要進行一次判斷,以決定到底第三個根取「次末」還是「末」。
- 無結構碼,比有結構碼好。因爲結構碼需要判斷字的構架。
- 首根小碼不後置,比後置好。因爲後置首根小碼,會擠佔一個主根的大碼或末根的小碼,如果判斷首根失誤,會造成回改。
對於編碼規則,一個從容易到困難的排序是:
- 只用大碼(嘸蝦米)
- 無結構碼和首根小碼
- 無結構碼,首根小碼只在不足四碼時使用(宇浩)
- 分爲取三根和四根,首根小碼緊跟首根大碼(鄭碼)
- 結構碼(五筆)
- 分爲取三根和四根,首根小碼後置佔位(徐碼)
我的方案採取第二種,這是因爲首根小碼可以允許繁簡通打,如果完全不加,那麽卽使在GB2312下重碼也非常高。
宇浩輸入法的規則如下:
- 取一、二、三、末根大碼
- 不足四碼時,補上末根小碼
- 仍然不足四碼時,補上首根小碼(如果是v不用補)
關於字根分佈
對於字根分佈,有幾個維度。一者,字根是否按橫豎撇捺分區排布;二者,一個鍵上的字根是否具有相似的屬性;三者,是按照鍵盤分區(打字主義,單映射),還是按字母表分區(檢字主義,雙映射);四者,如果有小碼,小碼是如何決定的。
目前的常見輸入法,一個從容易到困難的排序是:
- 字根大碼按鍵盤分大區,大區内比較亂序。字根無小碼。(五筆)
- 字根大碼按字母分大區,大區内完全有字形規律。字根小碼用字形提示。(鄭碼)
- 字根大碼按字母分大區,大區内比較有字形規律。字根小碼用拼音提示。(徐碼)
- 字根大碼完全亂序,小碼用拼音提示。
宇浩輸入法的字根排布,融合了五筆和徐碼的特點。
- 大碼按鍵盤分大區。(分區上YHN三鍵和五筆不同)
- 大區内比較亂序。
- 字根小碼用拼音提示。(某些字根用v鍵)
關於拆分規則
優先級:
少 順 散 連 交 斷 美 大
直觀的意思:
- 包圍不拆散,比如昜。
- 豎變斜是變形。
變形幅度在直觀的範圍内。這一點無法完全量化,畢竟文字是藝術。所以,我也增加了地區字形兼容碼。
字形
某些字形在常用字集内没有區分,或者共用 Unicode 碼位。真正的字形區分往往在 CJK 拓展區,屬於檢字範疇。爲了不增加判斷難度,因此:
- 冫和ㄑ都拆成二
- 日曰除卻「曰汩㫚」外都一併爲「日」
- 木朩𣎳字源不同,但已經混同,术朮亦同。故而不作區分。