fontconfig 警告:“/etc/fonts/fonts.conf”,第 100 行:未知“元素空白”

Ned*_* St 8 linux debian error-handling fontconfig

在我的 vps 服务器上收到此错误:

fontconfig warning: "/etc/fonts/fonts.conf", line 100: unknown element "blank"
Run Code Online (Sandbox Code Playgroud)

这是文件:

https://pastebin.com/VqcSgJ9x

如何解决?

jac*_*obq 7

TL;DR:您可能应该忽略此警告。

如果您觉得有点大胆,您可以尝试<blank>...</blank>从您的/etc/fonts/fonts.conf文件中删除该部分(如果您觉得不那么鲁莽,可以先进行备份)。当我尝试这个时,警告消失了。但是,您可能已经注意到文件顶部的一条看起来很吓人的消息说:DO NOT EDIT THIS FILE. IT WILL BE REPLACED WHEN FONTCONFIG IS UPDATED. LOCAL CHANGES BELONG IN 'local.conf'.所以这可能不是正确的解决方案。(如果你想知道我为什么这样做:我没有看到local.conf,懒得阅读精美的手册,并认为我的黑客被覆盖更像是一个功能而不是一个错误,因为维护者可能会发布官方解决方案无论如何,后来 - 除了我想学习。)

好的,让我们现在备份。这(不出所料)与fontconfig's<blank>元素有关,其用法在fontconfig 文档中描述为

<blank> 字体通常包括出现在编码中但在屏幕上绘制为空白的“损坏”字形。在元素内,将每个应该为空白的 Unicode 字符放在一个元素中。此集合之外的被绘制为空白的字符将从字体支持的字符集合中删除。

文档表明定义这些选项没有任何问题。此外,它们在 DTD指定。但是,您可能已经注意到了一个相关的 fontconfig API FcBlanks(重点是我的):

FcBlanks 对象保存了一个 Unicode 字符列表,这些字符在绘制时应该是空白的。扫描新字体时,任何空且不在此列表中的字形将被假定为已损坏且未放置在与该字体关联的 FcCharSet 中。这为应用程序提供了明显更准确的 CharSet。

FcBlanks 已弃用,不应在新编写的代码中使用。为了与旧代码兼容,它仍然被一些函数接受,但将来会被删除。

这向我表明,为了兼容性,它们在配置文件中是允许的,但不再打算使用。

没有更多信息,我不确定您在什么情况下看到此警告,但是,最近我在铬/电子/谷歌浏览器中看到了很多。看一眼 Chromium 的external/fontconfig提交历史,我注意到:

commit dc8326d3f116bb2a1425aa68660a332e351b6cb4
Author: Behdad Esfahbod <behdad@behdad.org>
Date:   Fri Sep 15 01:20:56 2017 -0400

    [fc-query] Remove --ignore-blanks / -b
    
    Blanks are the new black, err, dead!

...

commit 8b46a518bda8ecb3c5e2dfb0c1e5fda99e40aa3e
Author: Behdad Esfahbod <behdad@behdad.org>
Date:   Tue Sep 12 17:08:08 2017 -0400

    Update documentation for removal of blanks
    
    Patch from Jerry Casiano.

Run Code Online (Sandbox Code Playgroud)

您还可以在2.12.91 更改日志中看到这一点。我怀疑在铬更新到这个(或更新)版本的 fontconfig 时,警告开始出现。它看起来像发生了围绕2018年6月/ 69铬。查看DEPS文件third_party/fontconfig/BUILD.gn建议ba206df9b9a7ca300265f650842c1459ff7c634a(一些提交比 2.13.1 更新)用于嵌入式构建,同时 ChromeOS 和 Linux 将使用“系统版本”。如果我理解正确,这意味着在 Linux 上/为 Linux 构建 Chromium 时,build/install-build-deps.sh会安装libfontconfig1发行版提供的最新软件包(在我的情况下为2.11.0-6.7+b1)。在这一点上,我环顾四周以了解有关如何编译我的 Chromium 构建的更多信息,特别是,但后来我失去了兴趣。我假设维护者试图使其与发行版的其余部分保持同步。

最后,如果我没有记错的话,所有这些消息的真正含义是配置文件包含一些输出它的程序不会使用的信息(除了注释)。

也可以看看: