Pango/Cairo/Fontconfig:让Unicode字体回退/链接在Windows中正常工作

3

最近,一位Windows用户向我们反映,在我们的应用程序中,日语(以及其他Unicode字符)在Windows下无法正确显示。他只能看到带有数字的方框。

我们使用Pango、Fontconfig/freetype并使用Cairo进行渲染。在Unix系统(即Linux和macOS)上,它可以完美地工作。然而,在Windows下,我们似乎无法使其正常工作。

我想这可能与Windows下字体回退/链接的工作方式有关,但我甚至不知道从哪里开始研究如何使其正常工作。


根据我所阅读的内容,方框是缺失字形的Unicode代码。这使得问题更加确切是由于字体引起的。我不明白的是如何(或者是否可能)让Windows在这方面像Unix一样工作:即缺少字形时使用另一个字体。我甚至尝试手动将MS Gothic和其他一些字体添加到regedit中的FontLink键中,但什么也没有改变。 - Gregorio Litenstein
2个回答

3
原来问题比预期的简单,但文档中没有很好的记录。Fontconfig需要其配置文件(fonts.conf和在conf.d下找到的次要配置)。在Linux中,这从未是个问题,因为大多数(如果不是全部)发行版默认使用Fontconfig,所以即使其中一个出了差错,还是有一个系统配置可以回退。
相比之下,Windows通常不使用Fontconfig,因此除非开发人员发送一组Fontconfig配置文件,否则它最多只能加载指定的字体,但无法执行其他操作(如字体回退)。
解决方法是发送一个“fonts”文件夹,其中至少包含fonts.conf和从conf.d中选择的任何适当的定义,通常该文件夹应位于与Fontconfig库相同的文件夹中。(如果不起作用,你也可以将FONTCONFIG_PATH设置为“。”)
最后,除非你实际上对配置进行了特殊更改,否则你可以将默认配置文件从/etc/复制到你的应用程序中。

2

Linux系统是以fontconfig和字体替换为基础构建的,因此在Linux下可用的字体都被精心筛选,以便在该场景下良好运行。

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

另一个常见情况是非拉丁字体提供了简单粗暴的拉丁字形,以便不能替换字体的软件仍然能够以英文显示错误。它们需要在fontconfig中具体规则,以促进字体的有用部分,而不是填充部分。


在我的情况下,我看到的是具有该特定字符的utf8代码的正方形。最终,我所做的修复方法是将配置文件包含在我的发布中,并使用_putenv_s()在Windows上正确设置FONTCONFIG_PATH。 - Gregorio Litenstein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接