日月有常
注意
本方案基于宇浩拆分,为 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,因此实际编码空间数量为:
这个代数式是优美的,因为中间项可以全部约去。用
可以求得: