Pango/Cairo/Fontconfig:使 unicode 字体 fallback/linking 在 Windows 中正常工作

Pango/Cairo/Fontconfig: Making unicode font fallback/linking work properly in Windows

最近,一位 windows 用户告诉我们,我们应用程序中的日文(和其他 unicode)字符在 Windows 下无法正确显示。他只是得到带有数字的盒子。

我们正在使用 Pango,Fontconfig/freetype 并使用 Cairo 进行渲染。在 Unix(即 Linux 和 macOS)中,它工作得很好。然而,在 Windows 下,我们似乎无法让它工作。

我想这与字体 fallback/linking 在 Windows 下的工作方式有关,但我什至不知道从哪里开始研究使它正常工作。

原来这个问题比预期的要简单,但在任何地方都没有很好的记录。 Fontconfig 需要其配置文件(fonts.conf 和在 conf.d 下找到的辅助配置)。在 linux 中,这从来都不是问题,因为大多数(如果不是全部)发行版默认使用 fontconfig,所以即使有人搞砸了,仍然有一个系统配置可以依靠。

相比之下,windows通常不使用fontconfig,所以除非开发者出一套fontconfig配置文件,否则最多加载指定的字体,但它不能做任何事情其他(如字体回退)。

解决这个问题的方法是发送一个 "fonts" 文件夹,其中至少包含 fonts.conf 以及 conf.d 中的任何适当定义,通常该文件夹应与字体配置库。 (如果这不起作用,您可以将 FONTCONFIG_PATH 设置为“.”)

最后,除非您实际对配置进行了任何特殊更改,否则您只需从 /etc/ 复制默认配置文件即可随您的应用一起发布。

Linux 系统是围绕 fontconfig 和字体替换构建的,因此 Linux 下可用的字体在这种情况下可以很好地工作。

在其他系统字体中经常会遇到一些愚蠢的事情,比如将字体设计者尚未绘制的所有字形映射到占位符符号(通常为方形)。当 fontconfig 遇到这样的字体时,它不会用其他字体的 material 替换缺失的字形,因为该字体已经声明了要为这些代码点显示的内容。

另一种常见情况是非拉丁字体运送快速而肮脏的拉丁字形,因此无法替换字体的软件仍然显示英文错误。他们需要 fontconfig 中的特定规则,以提升字体的有用部分,而不是填充部分。