记录一次在 macOS 上与微软雅黑字体的搏斗¶
背景¶
最近在做 PPT,用了一个在 Windows 上制作的 PPT 模板,它用到了 微软雅黑 Light 字体,在 macOS 上显示不正常,因此做了一些细致的研究和排查,找到了原因和解决方案。
搏斗过程¶
遇到的问题是这样的:在 macOS 上做了一个 PPT,放到 Windows 或者鸿蒙的 WPS 上显示,发现字体渲染并不一致。如果在 macOS 上保存 PPT 的时候选择内嵌字体,它也会提示“微软雅黑 Light”字体不存在。说明 macOS 上并没有找到正确的字体,fallback 到了其他字体来显示。然后在 Windows 上找到了正确的字体,导致了效果的不同。
但实际上,macOS 上的 Office,是附带了微软雅黑的字体文件的:
> ls /Applications/Microsoft\ PowerPoint.app/Contents/Resources/DFonts/msyh*.ttc
'/Applications/Microsoft PowerPoint.app/Contents/Resources/DFonts/msyh.ttc'*
'/Applications/Microsoft PowerPoint.app/Contents/Resources/DFonts/msyhbd.ttc'*
'/Applications/Microsoft PowerPoint.app/Contents/Resources/DFonts/msyhl.ttc'*
对应了微软雅黑的不同的字重,其中 msyhl 就是对应了 Light。也就是说,虽然 macOS 没有字体,但 PowerPoint 自带了,理应正常支持。
然后,用 Python 探索了一下这些字体里的各种信息,发现了一些端倪:
────────────────────────────────────────────────────────────────────────────────────────────────────────────
■ face #1/2 Microsoft YaHei Light / Regular / MicrosoftYaHeiLight
────────────────────────────────────────────────────────────────────────────────────────────────────────────
# platform enc language nameID 含义 len off 文本
1 Windows(3) 1 英文(en) 1 Family 42 250 Microsoft YaHei Light
2 Windows(3) 1 英文(en) 2 Subfamily 14 292 Regular
17 Windows(3) 1 简体中文(zh-Hans) 1 Family 20 2220 微软雅黑 Light
18 Windows(3) 1 简体中文(zh-Hans) 2 Subfamily 14 292 Regular
这是微软雅黑 Light 的 name table,它的字体名称有英文和中文两个版本。如果我把字体改成 Microsoft YaHei Light,它就可以正常找到字体,说明我的英文 macOS 上的 PowerPoint 没有正确匹配字体的中文名。
我做了一个测试的 PPT,三行字,第一行是微软雅黑 Light 字体,第二行是 Microsoft YaHei Light 字体,第三是 Microsoft YaHei UI 字体。能明显看出第一行字体有问题,和第三行一样,而第二行字体是正确的:

后两行正确匹配了字体,所以渲染没问题。而同样的文件,放到 Windows PowerPoint 里打开,可以看到正确的显示结果:

前两个字体是同一个,和第三个不同,这是预期结果。
因此最后的解决办法就是:把模板里的字体,从微软雅黑 Light,改成 Microsoft YaHei Light。这样就可以在 macOS 和 Windows 上都能正常显示了。
至于鸿蒙 WPS 怎么办:从虚拟机 Windows 里复制 msyh*.ttc 字体,安装到鸿蒙里,就可以正常显示了。