Variant Diagnosis
异体字渲染诊断
这一页专门回答“异体字那排到底是图还是程序画的”。重新反查后,结论变得更具体了:原软件不是从安装包里切单字图片,而是先在 `Various` 表里取内部字码槽,再让字形控件按 UniID = 8/9 切到 Tripitaka Various 1/2 绘制;标准字位仍由 Tripitaka UniCode 承担。
判定标准
结论理由
- PK_Unity.bpl 中同时出现 TTntStringGrid、sgrdHanJaGlyph、SGrdDrawCell、FillHanjaGlyph、GetGlyphSetFromQryVarious,说明异体字面板更像字形网格。
- 安装包内未发现与异体字面板直接绑定的单字位图/图块候选文件。
- PK_Unity.bpl 中还直接出现 `Tripitaka Various 1/2` 字体名字符串,说明异体字网格会在运行时切换到专用字形字体。
- 标准字大字位和若干字形控件显式声明使用 `Tripitaka UniCode`,例如 `sgrdHanJaGlyph` 和 `LblStandGlyph`。
- 安装包里没有独立字体文件,也没有检出 PE `FONT/FONTDIR` 资源。
- 没有检出 `AddFontResource` / `AddFontMemResourceEx` 一类运行时字体装载调用。
- 同一模块还声明了辅助界面字体:New Gulim, Gulim, MingLiU, Arial Unicode MS, MS Sans Serif, Modern, Arial。
证据链
内部渲染链
- 先在 `Various` 表里按 `Standard = 4F5B` 查出异体字码,例如 `3598/3599/359A/359B`。
- 再由 `GetGlyphSetFromQryVarious` 把这些 `Code` 连同 `UniID` 组装成待显示字码集合。
- 随后 `FillHanjaGlyph` 把字码填进 `sgrdHanJaGlyph` 这样的网格控件。
- 最终由 `SGrdDrawCell` 按 `UniID=8/9` 选择 `Tripitaka Various 1/2`,再调用 GDI 文本输出完成绘制;标准字位仍使用 `Tripitaka UniCode`。
- 因为这些 `Code` 在 `UniCode` 里往往本来就对应别的字,所以不能直接信任系统默认 Unicode 字形。
为什么当前看不到原图字形
- 真正和字形显示直接相关的不是 `MingLiU/New Gulim`,而是 `Tripitaka UniCode` 与运行时切换的 `Tripitaka Various 1/2`。
- 它被声明在 `sgrdHanJaGlyph`、`LblStandGlyph`、`lstbxBusuGlyph`、`edtSutraname_H` 这些控件上。
- 其中异体字网格会按 `Various.UniID` 切到 `Tripitaka Various 1` 或 `Tripitaka Various 2`,而不是直接沿用系统默认字体。
- 安装包目录里没有找到 `.ttf/.ttc/.fon` 之类独立字体文件。
- 相关 `exe/bpl/dll` 的 PE 资源里也没有 `FONT/FONTDIR`。
- 程序里没有检出运行时临时装载字体的 API 线索。
- 这说明 `Tripitaka UniCode` 更像一个内部渲染链上的逻辑字体入口,而不是当前包里可直接提取的标准字体文件。
- `charset.cvb` 和 `fareast.btl` 只暴露了 949/950/936 等东亚码表驱动线索,更像字符集/驱动配置,不是字体文件。
这也解释了为什么我们之前只靠 macOS 自带字体会完全对不上:真正决定异体字外观的,是 Tripitaka UniCode,不是 MingLiU 或 New Gulim 本身。
码位复用证据
- `Various` 表共有 39955 条记录,其中 39937 条 `Code` 同时出现在 `UniCode` 表里。
- 这 39937 条重叠码位里,有 39935 条 `Standard` 与 `Various` 的目标字不同,有 39758 条韩音也不同。
- 这说明软件大量把现成 Unicode 槽位复用成自己的异体字槽,而不是直接沿用系统默认字形语义。
- 结合 `PK_Unity.bpl` 里的 `Tripitaka Various 1/2` 字符串,可以把 `Various.UniID = 8/9` 理解成两档异体字绘制字体槽。
- `佛` 的四个异体字码 `3598/3599/359A/359B` 在 `UniCode` 中各自有别的读音或释义,但在 `Various` 中被重新解释为 `佛` 的异体字。
- 另有 18 个 `Various.Code` 在 `UniCode` 中找不到同码记录,说明异体字槽位系统并不完全等同于标准字典表。
字体映射
重叠码位样例
佛 的主字段对比
佛 的异体字当前状态




佛 的内部槽位对照
后续接入口
未来如果拿到精确异体字资产,直接放进 assets/variant-glyphs/ 并更新 variant_manifest.json 即可。没有精确资产时,站点会只显示“待复原”,避免再把错误字形当成结果展示。
如果未来拿到合法来源的 Tripitaka UniCode 字体文件,也可以先走“字体复原”路线;当前样式表已经预留了本地字体挂载位。
诊断文件
compare/variant_render_diagnosis.json 负责“是图还是字体”的结论;compare/font_usage_diagnosis.json 负责“到底用了哪套逻辑字体、映射到哪些控件”;compare/internal_render_diagnosis.json 负责“内部码位槽是怎么被复用来画异体字”的证据链。脚本目录旁也会同步保留三份 JSON,方便后续复核。