拼音词典扩展(CustomDictLoader)

基本信息

属性 值
类型 PinIn 拼音词典扩展(静态内部类)
实现类 net.moecraft.nechar.NotEnoughCharacters.CustomDictLoader
父类 me.towdium.pinin.DictLoader.Default
注入方式 构造 PinIn 实例时作为参数传入
扩展条目数 14

作用

NotEnoughCharacters 的 @Mod 主类在静态字段初始化时就创建 PinIn 全局实例:

public static final PinIn CONTEXT = new PinIn(new CustomDictLoader()).config()
    .accelerate(true)
    .commit();

CustomDictLoader 先调用 super.load(feed) 载入 PinIn 默认词典,随后追加 14 个私有使用区(PUA)字形的读音。这些字形是金(钅)偏旁与部分异体字的组合——由于 Unicode 没有为它们分配标准码位,本模组自行在私用区取码并注册多音读法,使含这些字的物品名也能被拼音搜到。

固定设置:.accelerate(true) 开启加速(构造期一次性提交,不可配置)。

扩展字形清单

全部为 feed.accept(charCode, String[] 读音) 形式:

# 码位 字形 读音数组
1 \ue900 钅卢 lu2、jinlu
2 \ue901 钅杜 du4、jindu
3 \ue902 钅喜 xi3、jinxi
4 \ue903 钅波 bo1、jinbo
5 \ue904 钅黑 hei1、jinhei
6 \u9fcf 钅麦 mai4、jinmai
7 \ue906 钅达 da2、jinda
8 \ue907 钅仑 lun2、jinlun
9 \u9fd4 钅哥 ge1、jinge
10 \u9fed 钅尔 ni3、jiner
11 \ue90a 钅夫 fu1、jinfu
12 \ue90c 钅立 li4、jinli
13 \u9fec 石田 tian2、shitian
14 \u9feb 气奥 ao4、qiao、aoqi

读音规律:

  • 钅系字形(第 1~12 项)均提供双读音:单独的右半部读音(lu2、du4…)+ jin 前缀的整字读音(jinlu、jindu…)。
  • 钅尔(第 10 项)整字读音为 jiner。
  • 最后两项不是钅系:石田提供 tian2 / shitian,气奥提供三个读音 ao4 / qiao / aoqi。

码位分两类

类型 码位 说明
BMP 内私用区 \u9fcf、\u9fd4、\u9fed、\u9fec、\u9feb 单个 char 即可表示,物品名中出现即可直接匹配
高位 BMP 私用区 \ue900~\ue90c 同样是单 char;但某些字体/资源包会把这些字形以代理对形式传入,需要先归一化

代理对 → 单码位的归一化由 NecharUtils.replaceExtraChars 完成,覆盖 \ue900、\ue901、\ue902、\ue903、\ue904、\ue906、\ue907、\ue90a、\ue90c 共 9 个码位(词典中未出现在替换表里的 \u9fcf、\u9fd4、\u9fed、\u9fec、\u9feb 本就不需要代理对形式)。

匹配核心中的 Match.isChinese(char) 把 0xE900 <= i < 0xEA00 判为"中文",正是为了识别这批扩展字形(见 匹配核心 Match)。

配置提交的时机

NotEnoughCharacters.onConfigChange() 把 fuzzy 与 general 分类的全部配置项提交给同一个 CONTEXT:

调用顺序 配置来源
1 .fZh2Z(EnableFZh2Z)
2 .fSh2S(EnableFSh2S)
3 .fCh2C(EnableFCh2C)
4 .fAng2An(EnableFAng2An)
5 .fIng2In(EnableFIng2In)
6 .fEng2En(EnableFEng2En)
7 .fU2V(EnableFU2V)
8 .keyboard(KeyboardType.get())
9 .commit()

该方法在两个时机被调用:

  1. preInit(FMLPreInitializationEvent)——游戏启动时;
  2. NechConfig.setKeyboard(Spell) 内部——/nech keyboard 切换方案时(只改运行期,见 /nech 命令)。

相关条目