← 返回总览首页
Variant Diagnosis

异体字渲染诊断

这一页专门回答“异体字那排到底是图还是程序画的”。重新反查后,结论变得更具体了:原软件不是从安装包里切单字图片,而是先在 `Various` 表里取内部字码槽,再让字形控件按 UniID = 8/9 切到 Tripitaka Various 1/2 绘制;标准字位仍由 Tripitaka UniCode 承担。

判定标准

bitmap_pkg存在与异体字面板直接绑定的位图/图像资源。
font_drawn由字形集合 + 网格控件 + 字体/GDI 绘制完成。

结论理由

  • 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。

证据链

诊断结论font_drawn
必备字形网格证据TTntStringGrid
sgrdHanJaGlyph
SGrdDrawCell
FillHanjaGlyph
GetGlyphSetFromQryVarious
FraHanJaGlyph
LblStandGlyph
位图装载通用符号TImage
TBitmap
TImageList
LoadFromResourceID
LoadFromResourceName
异体字面板图像候选未发现
字体名线索Tripitaka Various 1
Tripitaka Various 2
Tripitaka UniCode
New Gulim
Gulim
MingLiU
Arial Unicode MS
MS Sans Serif
Modern
Arial
包内独立字体未发现
字形控件声明字体Tripitaka UniCode
运行时切换字体Tripitaka Various 1
Tripitaka Various 2
关键控件映射TFRAHANJAGRID / sgrdHanJaGlyph / HANGEUL_CHARSET
TFRASTANDARDINFO / LblStandGlyph / HANGEUL_CHARSET
TFRMCATALOGVIEW / edtSutraname_H / GB2312_CHARSET
TFRMUNIHANJA / lstbxBusuGlyph / HANGEUL_CHARSET
运行时字体装载未检出 AddFontResource / AddFontMemResourceEx
PE FONT/FONTDIR未发现
相关码表charset.cvb + fareast.btl

内部渲染链

  • 先在 `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,不是 MingLiUNew 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` 中找不到同码记录,说明异体字槽位系统并不完全等同于标准字典表。

字体映射

字体角色控件数Charset样例控件
Tripitaka UniCode异体字网格、标准字大字位和部首字形列表4GB2312_CHARSET, HANGEUL_CHARSETTFRAHANJAGRID / sgrdHanJaGlyph / HANGEUL_CHARSET
TFRASTANDARDINFO / LblStandGlyph / HANGEUL_CHARSET
TFRMCATALOGVIEW / edtSutraname_H / GB2312_CHARSET
TFRMUNIHANJA / lstbxBusuGlyph / HANGEUL_CHARSET
New Gulim韩文标签、说明字段与部分正文显示73ANSI_CHARSET, DEFAULT_CHARSET, GB2312_CHARSET, HANGEUL_CHARSETTCDICFORM / CDicForm / ANSI_CHARSET
TCDICFORM / StandInfoGrp / DEFAULT_CHARSET
TFRASTANDARDINFO / TntLabel3 / HANGEUL_CHARSET
TFRASTANDARDINFO / TntLabel1 / HANGEUL_CHARSET
TFRASTANDARDINFO / TntLabel4 / HANGEUL_CHARSET
TFRASTANDARDINFO / TntLabel6 / HANGEUL_CHARSET
MingLiU汉字检索、输入控件与多数字典窗体控件125DEFAULT_CHARSETTFRMCATALOGVIEW / TntSpeedButton1 / DEFAULT_CHARSET
TFRMCATALOGVIEW / TntLabel1 / DEFAULT_CHARSET
TFRMCATALOGVIEW / TntLabel2 / DEFAULT_CHARSET
TFRMCATALOGVIEW / TntLabel3 / DEFAULT_CHARSET
TFRMCATALOGVIEW / TntLabel4 / DEFAULT_CHARSET
TFRMCATALOGVIEW / TntLabel5 / DEFAULT_CHARSET
Arial Unicode MS词典列表、历史表格与释义富文本8GB2312_CHARSET, HANGEUL_CHARSETTFRMCATALOGVIEW / edtSutraName_P / GB2312_CHARSET
TFRMCATALOGVIEW / edtSutraName_T / GB2312_CHARSET
TFRMCATALOGVIEW / edtSutraName_S / GB2312_CHARSET
TTERMSFORM / sgList / HANGEUL_CHARSET
TTERMSFORM / sgHistory / HANGEUL_CHARSET
TTERMSFORM / rdMean / GB2312_CHARSET
Arial页签和容器默认字体2DEFAULT_CHARSET, HANGEUL_CHARSETTFRMUNIHANJA / PgCtrlUniHanja / HANGEUL_CHARSET
TINTINPUTDLG / IntEdit / DEFAULT_CHARSET
MS Sans Serif窗体默认后备字体14DEFAULT_CHARSETTFRMFINDREPLACE / FrmFindReplace / DEFAULT_CHARSET
TFRMSUTRAEDITOR / Color / DEFAULT_CHARSET
TKOR2CHINESEFORM / Kor2ChineseForm / DEFAULT_CHARSET
TMDICHILD / PlusGutter / DEFAULT_CHARSET
TSUTRABIBLIOINFOSEARCH / SutraBiblioInfoSearch / DEFAULT_CHARSET
TSUTRANAMESEARCH / SutraNameSearch / DEFAULT_CHARSET
Modern工具按钮与装饰性按钮16DEFAULT_CHARSET, HANGEUL_CHARSETTFRMCATALOGVIEW / btnPrevSutra / DEFAULT_CHARSET
TFRMCATALOGVIEW / btnNextSutra / DEFAULT_CHARSET
TFRMSUTRASEARCH / tbshtSutraTree / DEFAULT_CHARSET
TFRMSUTRASEARCH / tbshtSutraName / DEFAULT_CHARSET
TFRMSUTRASEARCH / tbshtSutraNum / DEFAULT_CHARSET
TFRMSUTRASEARCH / tbshtSutraSubject / DEFAULT_CHARSET

重叠码位样例

CodeUniCode.StandardVarious.StandardUniCode 韩音Various 韩音
80307670
34034E0F
34054E944E08
34064E0A
34074E0D
34084E0D
34094E0F
340A4E10
340B4E14
340C4E14
340D4E16
340E4E16

佛 的主字段对比

字段原软件截图当前解析结果判断
部首一致
总笔画77一致
剩下的笔画55一致
UniCode4F5B4F5B一致
韩音1.불;2.필1.불;2.필一致
中音1 FO2 2 FU21 FO2 2 FU2一致
韩意1.부처;깨닫다;2.돕다1.부처;깨닫다;2.돕다一致
中意1.釋迦牟尼;覺也 2.輔也1.釋迦牟尼;覺也 2.輔也一致
日意ほとけほとけ一致
英意buddha (contraction of MC bhi?dha)buddha (contraction of MC bhi?dha )近似/待人工复核
反切符勿切;薄宓切符勿切;薄宓切一致

佛 的异体字当前状态

原始编码UniID字体韩音部首渲染方式资产
35988Tripitaka Various 1字体/网格渲染3598.png
35998Tripitaka Various 1字体/网格渲染3599.png
359B8Tripitaka Various 1字体/网格渲染359B.png
359A8Tripitaka Various 1字体/网格渲染359A.png

佛 的内部槽位对照

槽位码UniID运行字体Various 韩音Various JungMaCodeUniCode 韩音UniCode 释义是否复用
35988Tripitaka Various 1NXXN놀라다
35998Tripitaka Various 1NXLK
359B8Tripitaka Various 1NJLN
359A8Tripitaka Various 1YZNG

后续接入口

未来如果拿到精确异体字资产,直接放进 assets/variant-glyphs/ 并更新 variant_manifest.json 即可。没有精确资产时,站点会只显示“待复原”,避免再把错误字形当成结果展示。

如果未来拿到合法来源的 Tripitaka UniCode 字体文件,也可以先走“字体复原”路线;当前样式表已经预留了本地字体挂载位。

诊断文件

compare/variant_render_diagnosis.json 负责“是图还是字体”的结论;compare/font_usage_diagnosis.json 负责“到底用了哪套逻辑字体、映射到哪些控件”;compare/internal_render_diagnosis.json 负责“内部码位槽是怎么被复用来画异体字”的证据链。脚本目录旁也会同步保留三份 JSON,方便后续复核。