Windows 字体折腾指南

改善Windows自身的字体渲染效果

众所周知,Windows的字体渲染的效果非常差,从隔壁系统过来的话常常会感到眼睛受到了侮辱。但是Windows10自带字体呈现效果似乎有了改观,启用ClearType,在高分屏下改观尤为明显,只可惜用户安装字体可能无法享受这个待遇,而Windows10自带的UI字体微软雅黑又胖又矮实在有点倒胃口,新版微软雅黑又迟迟不见踪影。

2160p对比1080p,2160p为200%UI缩放,1080p为nearest-neighbor插值upscaling到2x,字体为微软雅黑(Microsoft Yahei UI),字号为10pt

实际上,并非Windows对字体有偏见,而是进行了良好 hinting 字体在 Windows10 上面有较佳的渲染效果,而 ttfautohint 能自动生成 hinting 后的新字体。(由 FreeType 的 auto-hinting 模块处理)

ttfautohint 的 Introduction 摘录:

ttfautohint is a library written in C that takes a TrueType font as the input, removes its bytecode instructions (if any), and returns a new font where all glyphs are bytecode hinted using the information given by FreeType’s auto-hinting module. The idea is to provide the excellent quality of the auto-hinter on platforms that don’t use FreeType.

可以把喜爱的字体通过 ttfautohint 处理后安装到 Windows,至于如何使用这个软件,请大家读读文档自行摸索,因为 本文的作者也不会用 这个软件比较专业。

如果想要一个现成的中文字体,知乎大佬 Belleve 提供了 更纱黑体,基于思源黑体调整,很适合用来做Windows系统字体。 ​以下所有讨论都基于2160p/27″屏幕、200%UI缩放和Windows10 1909更新,更旧或更新的版本请自行验证。

替换字体

请小心使用以下内容,这些操作可能损坏你的系统,本文作者不承担任何责任:

安装了新字体后,浏览器可以注入样式表强制启用新字体,但桌面软件的UI还是该用啥用啥,除非能手动改(逐软件改也很麻烦),否则新字体还是不能用。如果希望把系统字体替换掉,可以尝试以下方法,这个方法需要安装AFDKO置换新字体的name表12为系统字体的name表,然后伪装成系统字体安装。

安装好AFDKO,克隆这个repo,里面包含了一些本文作者处理字体问题的脚本。

进入本地repo目录,其中包含将微软雅黑替换成更纱黑体的脚本 replace-msyh-by-sarasa.bat 和恢复微软雅黑的脚本 restore-msyh.bat

该脚本需要管理员权限,该脚本会自动注销系统,该脚本会从网络下载字体文件,该脚本需要执行两次!

执行替换脚本 replace-msyh-by-sarasa.bat,该替换脚本会自动备份原版字体到脚本同级的 msyh-backup 下, 然后下载更纱黑体并自动生成伪装成雅黑的字体文件到 sarasa, 最后会删除字体的注册表项目并注销当前用户。

登录后再次执行该脚本,它会自动安装字体文件到系统目录并再次此注销。

再次登录,大功告成,效果如:

上面是微软雅黑,下面是更纱黑体,尽管摆脱了肥硕的微软雅黑,但是新字体部分字形表现不佳

restore-msyh.bat 的操作完全与上面相同,不同的是它将 msyh-backup 下的原版字体安装到系统。

如果需要替换其他字体,则需要自行修改脚本来适配。

品如的字体

macOS里预装了很多可爱的字体,如果你学会绕过系统的限制把它们提取了出来,就会遗憾地发现很多字体在Windows下不能用

网络流传有用sed替换苹方cmap表的attribute的方法,可惜这只对苹方和其它部分字体有用,sed替换命令没有处理name表,对cmap表的处理也过于草率。 上面的font-hack里还提供了一个名为macfonts.py的脚本,可以改善mac字体的兼容性,用法:

python macfonts.py [*.ttf|*.otf|*.ttc|dir]

几个字体相关的注册表键值

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts]
  • 映射已安装的字体文件

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink]

  • 字体的 fallback 表,很多软件喜欢用Tahoma作UI字体,这个字体没有中文码位,所有中文字形都通过此条目 fallback 到宋体上面(无衬线配衬线,嗯),把Tahoma键对应数据里的SIMSUN.TTC,SimSun替换成MSYH.TTC,Microsoft YaHei UI,128,96,用Tahoma显示字体的软件就不会显示成宋体了

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes]

  • 字体的 substitute 表,没有安装、但键值存在于的字体会被键值对应的数据指代的字体冒充

替换Qt程序的字体引擎

在存在Qt动态库(Qt5Core.dll等等)的文件夹下面新建qt.conf,如果已经有文件则直接编辑该文件,添加以下行:

[Platforms]
WindowsArguments = fontengine=freetype

显式要求Qt程序使用freetype渲染字体。

替换系统字体渲染引擎

MacType 可以通过 Hook Windows API 替换 GDI 字体渲染引擎为 FreeType,规避了Windows提供的糟糕字体渲染,还能自定义许多渲染选项和字体热替换。这个软件本来是年久失修的,最近忽然又开始更新了,而且实验性的支持了 DirectWrite,尽管这个解决方案有诸多问题,还是建议大家尝试。

终极解决方案

如果追求完美的字体体验,还是 购买mac 使用Linux DE吧!

分享到