日月有常
注意
本方案基於宇浩拆分,爲 25.5 鍵、亂序、音托、前綴碼、繁簡通打方案。初始學習難度較大,請務必充分瞭解、分析、平衡其風險和收益後再決定是否學習使用。
簡介
日月輸入法是基於宇浩拆分的衍生方案,也是世上第一款純形前綴碼方案,可完全離開空格鍵。其名源自《尚書大傳》之「日月有常,星辰有行」。
本方案的字根或兩碼、或三碼。稱爲大碼、聲碼、韻碼:
- 大碼在
BCDFGHJKLMNPQRSTVWXY
鍵上亂序分佈,共 20 鍵。 - 聲碼取字根讀音的聲,在
BCDFGHJKLMNPRSTXZ
等 18 個鍵上分佈,ZHㄓ CHㄔ SHㄕ
映射到SRK
上。部分字根爲零聲母,則不取聲碼。Rㄖ
及RENㄖㄣ
、RUㄖㄨ
作零聲處理。 - 韻碼取字根讀音的韻,在
AEIOU
等 5 個鍵上分佈,如遇多元音或特殊元音,則映射到AEIOU
上。 例如:魚
的韻是ㄩ
,映射到E
鍵上;歐
的韻是ㄡ
,映射到e
鍵上;月
的韻是UEㄩㄝ
,映射到E
鍵上。
注意
聲碼、韻碼依照的是字根的實際讀音,而不是漢語拼音。比如:
一
的大碼爲F
,聲碼爲空,韻碼爲I
,全碼爲FI
。二
的大碼爲S
,聲碼爲空,韻碼爲O
,是讀音ERㄦ
的映射。
如果一個字根有若干讀音,一般取最常用的讀音作爲聲碼韻碼。有時也取不常用的讀音來增加手感,如土
的聲碼取D
。
如果一個字根無音,則聲碼爲空,韻碼取O
。
下表爲拼音、韻碼對應表:
A | O | E | I | U |
---|---|---|---|---|
a | o uo wo | e ê | i yi | u* wu |
er | ü u* | |||
ei | ai | |||
ou | ao | |||
ia ya | ie ye | iao yao | iu you | |
ua wa | ui wei | üe ue yue | ||
an | in yin | en ian* | ian* uan uen | |
iang yang uang wang | ang | ing iong yong | ||
uang wang | eng | |||
ren | ru | ri | (sh)ri* |
下表爲注音、韻碼對應表:
A | O | E | I | U |
---|---|---|---|---|
ㄚ | ㄛ ㄨㄛ | ㄜ ㄝ | 〡 | ㄨ* |
ㄦ | ㄩ ㄨ* | |||
ㄟ | ㄞ | |||
ㄡ | ㄠ | |||
〡ㄚ | 〡ㄝ | 〡ㄠ | 〡ㄡ | |
ㄨㄚ | ㄨㄟ | ㄩㄝ | ||
ㄢ | 〡ㄣ | ㄣ 〡ㄢ* | 〡ㄢ* ㄨㄢ ㄩㄢ ㄩㄣ | |
〡ㄤ ㄨㄤ | ㄤ ㄥ | 〡ㄥ ㄩㄥ | ||
ㄖㄣ | ㄖㄨ | ㄖ | (ㄕ)ㄖ* |
下表爲拼音、注音、韻碼對應表:
完整拼音 | 註音 | 韻碼 | 舉例 | 備註 |
---|---|---|---|---|
a | ㄚ | A | 巴 | |
ai | ㄞ | E | 白 | |
an | ㄢ | A | 干 | |
ang | ㄤ | E | 上 | |
ao | ㄠ | I | 勹 | |
e | ㄜ | E | 禾 | |
ei | ㄟ | O | 黑 | |
en | ㄣ | E | 艮 | |
eng | ㄥ | E | 生 | |
i | ㄧ | I | 一 | |
ia | ㄧㄚ | A | 牙 | |
iao | ㄧㄠ | I | 幺 | |
([qtdbx])ian | 〡ㄢ | I | 丶 | 聲母在左時 |
([pljmn])ian | 〡ㄢ | E | 面 | 聲母在右時 |
iang | ㄧㄤ | O | 羊 | |
iê | ㄧㄝ | E | 也 | |
iou | ㄧㄡ | U | 又 | |
in | ㄧㄣ | O | 廴 | |
ing | ㄧㄥ | I | 丁 | |
iong | ㄩㄥ | I | 用 | |
ong | ㄨㄥ | I | 工 | |
ou | ㄡ | E | 缶 | |
u | ㄨ | U | 鳥 | 非mu/pu時 |
([mp])u | (ㄇ)ㄨ | E | 母夂 | mu/pu時 |
ua | ㄨㄚ | A | 爪 | |
uan | ㄨㄢ | I | 川 | |
uang | ㄨㄤ | O | 王 | |
uen | ㄨㄣ | I | 文 | |
uo | ㄨㄛ | O | 𠂇 | |
üan | ㄩㄢ | I | 犬 | |
üê | ㄩㄝ | E | 月 | |
ü | ㄩ | V | 魚 Be | |
ri | ㄖ | I | 日 Ji | 非shi時 |
(sh)ri | ㄕㄖ | U | 十 TKu | shi時 |
ru | ㄖㄨ | E | 入 Ke | |
ren | ㄖㄣ | O | 人 Wo |
單字取碼規則如下:
- 取首根大碼和聲碼。
- 依次取二、三、末字根的大碼;
- 不足五碼時,補末根聲碼。
- 不足五碼時,補末根韻碼。
注意到,大碼和聲碼所在的鍵位(A區)同韻碼所在的鍵位(B區)互斥,故而韻碼可作爲單字的自然分隔符。不滿五碼時,不用空格也可進行連續輸入。
本方案全字集低重、繁簡通打,其關鍵數據如下:
- GB2312 重碼數 186
- 國字常用字重碼數 56
- GBK 重碼數 2658
- 簡體動態選重率 0.021%
- 繁體動態選重率 0.032%
- 繁簡混合動態選重率 0.034%
- 全碼速度當量 1.239
以下爲本方案的字根表,以供參考:
20250618 更新
- 丂 -> Fki ~ 匚
- 丅 = 丁 -> Ddi
- 勹 = 冂 -> Ho
- 忄 = 心 -> Jxo
- 舟 -> Jse
- 冖 = ⺈ -> Mo
- 䒑丷 -> Xci
- 皮 -> Dpi
- 丩 = -> Qo
20250622 更新
- 丁下 -> K
- 咼骨 -> J
- 厂丆 -> K
- 臣 -> J
- 片爿 -> S
- 末未 -> B
- 甲电 -> F
- 廴 -> D
- -> D ~ 口
20250630 更新
- 疒 -> Gne
- ⺍ -> Lxi ~ 小
- -> Dji ~ ⺔ (避免 ⺔ - 豕 編碼不一致)
- 川巛ㄍ -> Jri (同指不位移優先)
- 工 -> Jgi (同指不位移優先)
- 瓦 -> Ja (同指不位移優先)
- 見 -> GJe ~ 目 (聚類)
字根表
大碼 | 字根 |
---|---|
上排 | |
q | 几ji 殳ku 卯mi 丱gi 丩o |
w | 力li 合he 人亻o 隹co 申ke 禺e |
r | 立li 黑ho 石ku 王o 丌ji 身ke 毛mi 文i 鳥ni 烏u 車re 門me 鬥de |
t | 火ho 由u 巾jo 十ku 夂pe 攵pe 尚ke 衤i |
y | 刂di 阝fu 竹su 气qi 西xi 酉u |
p | 雨e 大da 夫fu 犭qi 豸si 犬qi |
中排 | |
s | 至si 用i 舌ke 二o 冫o 尢o 尤u 户hu 尸ku 隶li 肀e 彐ji 木me 片pe 爿pa |
d | 口ke o 宀ma 长re 已i 己ji 廴o 母me 言a 金jo 皮pi |
f | 一i 匚fe 丂ki 牙a 丿pe 乃ne 手ke 水ko 电di 甲ja 鱼e 面ma 而o 食ku |
g | 九ju 扌ke 革ge 夭i 儿o 广go 疒ne 鹿lu 麻ma 牛nu 豕ku 目me 罒o 皿mo 貝bo 頁e 見ja |
h | 辰re 其qi 自zi 亥he 习xi 勹冂o 乌u 鸟ni 页e 贝bo 冊ce 走ze 齒ri 止si 田ti |
j | 刀di 门me 丰fe 夕xi 矢ku 心忄xo 上ke 寸ci 巳si 巴ba 臣re 早zi 曰e 日i 鬼go 舟se 骨gu 咼ga 工gi 瓦a 巛ri 川ri |
k | 辛xo 饣ku 甫fu 丬qo 弓gi 之si 马ma 里li 古gu 千qi 囗o 三sa 且qe 下xa 丁丅di 厂丆re 入e 八ba 凵ka 屮ci 戈ge 戊u 弋i 彳ri 彡ka 臼ju 白be 纟si |
l | 曲qe 兀u 欠qi 干ga 匕bi 正se 穴xe 丨gi 非fo 子zi 予e 了le 高gi 方fe 亡o 亠te 向xo 小xi 糸si 幺i 辶ro 髟bi 長re |
下排 | |
x | 䒑丷ci 羊o 钅jo |
c | 世ku 女ne 氵ko 來le 乙i 乚i 飛fo 又u 生ke 禾he |
v | 见je 山ka 业e 米mi 讠e 车re 乂i 士ku 土du 斤jo 戶hu |
b | 虎hu 卜bu 魚e 灬bi 馬ma 爪sa 瓜ga 亦i 示ku 末mo 未o |
n | 足zu 缶fe 壬o 亍ru 厶si 丶di 月e |
m | 艮ge 耳o 不bu 丑re 七qi 乜me 也e 艹ci 卅sa 虫ri 風fe 冖⺈mo |
簡碼和詞語
簡碼設置如下:
- 一碼上屏字,5個:的E、是I、我O、不U、了A。
- 兩碼上屏字,56個:取首碼和末根韻碼,如:你WI、坐WU、和CE。等效一級簡碼。
- 三碼上屏字,457個:前兩碼和末根韻碼,如:段WKU、得KRI、只DKA、中DKI。等效二級簡碼。
詞語編碼如下:
- 兩字詞(詞庫不内置)
- 三字詞:首字首根大碼 + 首字首根聲碼 + 次字首根大碼 + 次字首根聲碼 + 第三字編碼,截取前五碼。
- 「好不好」的編碼是
CN + MB + C
。 - 「不知道」的編碼是
MB + JK + X
。 - 「一下子」的編碼是
F + HX + LZ
。
- 「好不好」的編碼是
- 四字詞:首字首根大碼 + 次字首根大碼 + 第三字首根大碼 + 第四字編碼,截取前五碼。
- 「不置可否」的編碼是
M + G + H + MB
。 - 「自作自受」的編碼是
H + W + H + BS
。
- 「不置可否」的編碼是
- 五字及以上詞:首字首根大碼 + 次字首根大碼 + 第三字首根大碼 + 第四字首根大碼 + 末字首根大碼。
- 「不管三七二十一」的編碼是
M + Y + K + M + F
。 - 「中华人民共和国」的編碼是
D + W + W + J + K
。
- 「不管三七二十一」的編碼是
優缺點
本方案爲首款純形前綴碼方案,優缺點都十分突出,故總結如下:
缺點
- 字根大碼隨機,初始學習難度較大,同鍵位字根之間的字形關係不強,難以進行相似字形聯想記憶。
- 單字最高碼長爲五碼,碼長較長,不適合追求极致碼長的用户。
- 只專注於單字,不設詞庫。
- 簡碼不是全碼的前綴。
優點
- 首根信息完整,大字集重碼極低,遠超宇浩輸入法其他方案。
- 本方案不需要按空格,特别適合腱鞘炎患者。
- 雙手互擊、擊鍵速度當量、用指分佈極佳。
- 專注於單字,無需記憶詞語,輸入流暢。
難度
更易 | 更難 | |||
---|---|---|---|---|
大碼 | 星陳 | 光華 | 日月 | 卿雲 |
小碼(聲韻) | 卿雲 | 星陳 | 日月 | 光華 |
設計思路
形碼方案中的離散問題,主要在於多根字。多根字的離散問題,主要在於首根和末根。爲什麼這麽講?注意到,通過更換部首或部件,我們可以排列組合出大量漢字,如:「問问吝各束杏回可台呇扣和吉召吕唇知否喜可右启叵釦名占句售告如」,都是由一個部件搭配「口」字根組成的。一旦任意两個首根位於同一鍵位上,則會産生重碼。這個例子中,共有30個字,也就是有30個首根,但按鍵一般是26個,根據抽屜原理,必然會在一個按鍵上有兩個字根,這就説必然會有兩個字的編碼相同。常見的漢字部首大約一百個,爲了避免出現重碼,必須要有足夠的按鍵數量或編碼空間來容納它們。對稱地,末根的離散問題也同樣存在。
如何解决首根和末根的離散問題?在這方面,前人有多種探索:
- 用漢字結構和末筆信息作爲補充編碼。主要解决同拆異形(如「束杏」)、提高末根離散。最早可追溯到五筆。它的缺點是不僅需要知道結構和末筆,還需要進行一次交叉映射,使用時難以形成肌肉記憶。
- 减少字根數量和大小。當按鍵數量不變時,通過減少字根數量和大小,將部首繼續分解,可以變相減少編碼衝突的可能。五筆、倉頡都是這樣的例子。它的缺點是,不少常見字根被拆分成了多個小字根,不僅不直觀,還會造成複雜漢字中間部分的信息丟失,增加重碼的可能性。
- 大字根雙編碼。反其道而行之,通過增加字根編碼的長度,來增加編碼空間。26個按鍵,若每個按鍵有兩個編碼,則可以容納676個字根,兩個部首放到同一個「抽屜」的可能性直線下降,從而明顯減少重碼的可能。這個思路最早可追溯到鄭碼。它的缺點是:
- 一、打詞的時候,同部首的字會形成大量重碼,如「猫猫」「狗狗」「狼狗」等。鄭碼的解決方案是詞語編碼和單字編碼不一致。徐碼的解決方案是將首根小碼後置。但這樣的設計,會增加學習成本。
- 二、抽屜增加到了676個,但常用部首只有100個左右,前兩碼的組合空間不少被閒置出來,這樣的設計,造成簡碼效率低下。對此,鄭碼的解決方案是設置主副根,首根是主根則不取小碼,首根是副根則取小碼。由於主根的存在,前兩碼的組合空間不會被浪費。但這樣的設計,會使得規則複雜化,有時取三根、有時取四根,還是增加了學習成本。
- 多取字根。在小字根的基礎上,多取一個字根,達到減少重碼的目的。倉頡便是代表。它的問題是碼長較長,簡碼和詞語效率較低。倉頡便不設簡碼,不設詞語,專注於單字輸入。因爲字根和規則簡單,學習成本較低,相比之下,碼長較長的問題就不那麽突出了。
宇浩拆分主要走的是大字根的設計思路,也就是鄭碼一系的策略。因爲這套方案更容易實現大字集低重碼,可以繁簡通打,且碼長可控。關於首根的離散問題,基於宇浩拆分各方案的設計型態是:
- 光華:字根雙編碼、首根小碼後置、不分主副根且只有雙根字取首根小碼(創新)、字根分區。兩根字編碼:
AZza
- 星陳:字根雙編碼、小碼取聲、首根小碼後置、不分主副根且只有雙根字取首根小碼、字根聚類。兩根字編碼:
AZza
- 卿雲:字根雙編碼、小碼取聲、首根小碼不取、不分主副根、首根分區。兩根字編碼:
AZz
以上三個方案都有缺點:
- 光華、星陳的首根小碼後置,會在輸入時造成一定思考。
- 卿雲的首根小碼不取,會造成首根分離度變差。常用字集字頻加權選率尚且可控,但一旦字集增大,或更換文本風格,重碼率會大幅上升,且不穩定。
- 以上方法,輸入時都需要按大量空格鍵,對大拇指不友好。
於是,我一直都在思考一個這樣的方案:
- 首根小碼永遠取全,大字集重碼更低。
- 首根小碼不後置,輸入時更流暢。
- 儘可能减少空格鍵使用,對大拇指友好。
我姑且稱之為卿雲++。也就是以下的單字編碼方式:Zz
AaZz
AaBZz
AaBCZz
等,且使用全碼連打模式。
那麼問題來了:首根小碼永遠取全,意味着編碼至少是五碼,碼長會變長;首根小碼不後置,意味着簡碼效率降低,不能打詞;儘可能减少空格鍵使用,意味着需要有系統的字間分隔方法。
當然,答案也許就在問題當中。全碼變成五碼,但可以通過連續輸入來減少碼長,這和減少空格鍵使用是相輔相成的。簡碼效率降低,不能打詞,我們就乾脆不打詞,專注打單,提高擊鍵。同時,一旦不用空格鍵,那麽等於簡碼少輸入一碼,抵銷了簡碼效率降低的問題。
歸根結底,問題的核心只有一條:如何减少空格鍵使用。
减少空格鍵頻率,一個方式是使用連續輸入,比如全碼連打。但字和字之間的分隔是模糊的,需要用詞庫來進行預測。一般情況比較準確,但有時也會出現分隔錯誤,比如「不二」和「些」在卿雲中都是NBAE
,「説一不二」常常被預測為「説一些」。
另一個方法,就是頂功。頂功方案把按鍵分爲兩個區域,A區和B區。輸入時,先輸入若干A區鍵,然後輸入若干B區鍵。A區域鍵和B區域鍵之間形成自然分隔符,一旦輸入B區鍵,再輸入A區鍵,則會自動認爲是下一個字,而不用按空格鍵。(其實定長方案也是一類頂功方案,只不過它的A區是26個字母,B區只有一個空格鍵。)
但頂功方案一般需要從某一鍵開始使用小鍵集進行輸入。從形碼的角度來看,小鍵集的自然選擇就是筆畫了。比如逸碼,就是從第三個字根開始使用五筆畫拆分。一旦見到想要的字,直接輸入下一個字,就可以上屏前一個字。從另一個角度説,頂功方案用若干B區鍵,分攤了空格鍵的功能,且B區鍵自帶部分漢字信息。
頂功方法可否拓展到宇浩拆分?似乎可以,比如前三根分別取首根大碼、首根聲碼、次根大碼,後面全部拆成五筆畫。但是這樣的話,會有以下問題:
- 筆畫拆分後,全碼碼長會變長,最高可能會有六、七碼。如果有人想打全碼會比較累。
- 將字拆成筆畫,用戶需要對於字形的認識較深,對於筆順較熟。並且,一旦某些字形出現歧義,用戶容易打不出字來。
- 拆成筆畫,等同於改變了宇浩拆分。
接下來的很長時間,我都在思考如何讓頂功適用於宇浩拆分,並對一些維度進行取捨。最好的情況是,能夠保持目前宇浩各方案的拆分和編碼方式。最後,偶然的機會,我想到了在小碼上做文章。
考慮到,基於首根小碼永遠取全和首根小碼不後置的設計,若用空格上屏,雙根字編碼為AaZz_
。那麼,可以進行以下步驟:
- 第一步,將末尾空格鍵替換為若干B區按鍵的集合
AaZzβ
,其中β
代表B區按鍵。 - 第二步,讓B區按鍵
β
和末根Z
有某種內在的聯繫。問題是,如何讓一個字根的小碼能分成兩部分呢?一個自然的思路就是聲母和韻母。因為在漢語拼音中,聲母所在的按鍵,和元音所在的按鍵是隔離的。我們只要定義A區的按鍵為BCDFGHJKLNMPQRSTVWXYZ
,B區的按鍵為AEIOU
,便能自然形成隔離。比如「千」的第一小碼取聲母Q
,第二小碼將韻母IAN
映射到B區按鍵中的某個按鍵即可。 - 第三步,我們將一個字根設置成三碼,大碼
Z
、聲碼z
、韻碼ⓩ
。這樣,雙根字的編碼就變成了AaZzⓩ
。 - 第四步,我們只需要確定
ⓩ
的映射規則。
這樣,我們就可以得到一個新的方案,它的編碼最長五碼,有以下可能:
- 一根字:
Zzⓩ
。 - 兩根字:
AaZzⓩ
。 - 三根字:
AaBZz
。 - 四根以上字:
AaBCZ
。
觀察到,韻碼不僅包含了部分的字根信息,還能夠作爲字根之間的分隔符。一旦用戶輸入了韻碼,這個字就被唯一確定,可以直接上屏。由於取到五碼,且首根聲碼永遠取全(鄭碼、徐碼也是),此設計可以保證大字集極低重碼。碼長方面,雖然最長五碼,但可以通過連續輸入來減少碼長,比倉頡效率更高。最後,我們得到的是一個重碼比倉頡低,碼長比倉頡短,且完全不需要空格鍵的大字集方案。
到此為止,其實可以說,這個方案已經完成了。但我還是覺得有些不夠完美:
- 碼長還是太長,從兩根字開始都是五碼。
- 首根取大碼、聲碼,會有大量空間浪費,簡碼效率不高。
- 手感不會太好,畢竟聲碼出現了
Y
,比如「一」的編碼是FYⓘ
。不論是當量還是鍵位分佈,都不好。
如何解決這些問題?我從卿雲的小碼設計中找到了答案,並且同時解決了以上三個問題。卿雲中,零聲母的yi
韻,直接取了小碼I
,而不是Y
。這個方法可以適用到新方案中。對於部分零聲母的字根,我們可以無視它的聲碼,直接取韻碼。也就是説,這些字根字全碼只有兩碼:Zⓩ
。那麼,單字的編碼可行組合明顯增加:
- 一根字:
Zⓩ
Zzⓩ
。 - 兩根字:
AaZzⓩ
AaZⓩ
AZzⓩ
AZⓩ
。 - 三根字:
AaBZz
AaBZⓩ
ABZzⓩ
ABZⓩ
。 - 四根以上字:
AaBCZ
ABCZz
ABCZⓩ
。
眼尖的你可能看出來了,這和鄭碼、徐碼的主副根設計不謀而合。他們當初這樣設計,一者,可以增加前兩碼的編碼空間效率,二者,對於首根為主根的字多取一根,能夠攫取更多的信息。但是,它們的主根和副根小碼取碼不統一,變相增加了小碼的無理性。
而通過省略零聲母字聲碼的方法,我們也可以達到同樣的效果,但小碼的設計邏輯更加統一。可以說,我主觀上沒有分主副根的意圖,但客觀上或許實現了主副根的效果。
至此,碼長得到了降低,簡碼效率得到了提高,手感也得到了改善,方案也就完成了。老傳統,我用《尚書大傳》之「日月有常,星辰有行」將它命名為日月。其實也暗藏着聲碼和韻碼、A區和B區的對立關係。
這個方案,雖然在按鍵區分了A區和B區,但它不同於頂功方案。頂功方案中,只有輸入了下一個字的A區鍵,纔意味著上一個字輸入完畢,可以上屏。而本方案中,只要出現B區按鍵(韻碼),便意味着這個字已經輸入完畢,可以上屏了。而A區按鍵,如同前綴一樣附著在最後的B區按鍵上。嚴格地說,它應該叫自由前綴碼方案。
日月方案,全碼碼長和其他方案對比如下:
方案 | 全碼碼長 簡體文本 |
---|---|
光華 | 4.00 |
星陳 | 4.00 |
卿雲 | 3.83 |
日月 | 4.32 |
做完了全碼,接下來是簡碼的設置。注意到,一個字的全碼一定以A區鍵開始,所以當你第一碼輸入的是B區鍵時,其實是個空碼。我們可以充分利用這個五個空鍵位,將它們設置成簡碼,放入最常用的幾個漢字:的、是、我、不、了。因為一個字一定是以B區鍵結束的,因此當你輸入這些簡碼時,會自動上屏。也就是說,你擁有了五個真正的一碼字。按下E
,你直接看到「的」字上屏。這五個簡碼,可以將碼長減少到4.0左右。
其他的簡碼,會有兩種模式:
- 一種模式,是常規的簡碼,它是全碼的前N碼。你可以像其他方案一樣,通過空格鍵上屏。
- 另一種模式,是帶有上屏性質的簡碼,它取全碼的前N碼,並且在末尾加上末根韻碼上屏。注意到,這類簡碼並不是全碼的前N碼,因此需要特殊記憶。日月方案中,這類簡碼只設置500個。它們將碼長減到了3.4左右。
以上就是日月方案的設計思路。它的優點缺點都很突出,特別適合喜歡打單字的用戶、不願打空格的用戶、對重碼要求較高的用戶。
A區B區按鍵數量
由於按鍵需要分爲互不重合的A區和B區,A區或B區的數量必然在1到24之間。具體數量,應當取決於如何讓編碼空間最大化。注意到,依據日月的取碼規則,首根不取Z,因此實際編碼空間數量為:
這個代數式是優美的,因為中間項可以全部約去。用
可以求得: