首页 > 技术文章 > 「Font」- 设置 Fallback 字体(如果字体 A 中不存在某个字符,则从字体 B 中加载该字符) @20210223

k4nz 2021-02-23 10:35 原文

问题描述

我们认为,标题已经准确的描述出本笔记的内容。我们再详细补充说明:我们常用的字体有 Microsoft YaHei、Courier 10 Pitch、Consolas 等等,虽然这些字体可以正确显示中文以及英文,但是却无法显示 Emoji 表情,因为这些字体中并没有 Emoji 表情的字体(其实 Courier 10 Pitch 连中文字体都不支持)。当没有特定字体时,该字符将显示为方块(注意“没有字体”与“乱码”这两者的区别)。

此时,我们就需要设置“备用(Fallback)字体”,即:当字体 A 中没有某个字符时,从字体 B 中加载该字符。

该笔记将记录:在 Linux 中,如何设置备用(Fallback)字体,以及常见问题处理。

解决方案

在 Linux 中,设置字体需要通过 Fontconfig 完成。该应用无需自行安装,因为它是在图形界面下必须的应用,默认已经安装。

我们的配置,也是围绕 fonts.conf 文件。对于入门学习,阅读 Font configuration - ArchWiki 页面。更多详细内容,参考 man 5 fonts.conf 手册。

作为普通用户,建议修改 $XDG_CONFIG_HOME/fontconfig/fonts.conf(通常为 ~/.config/fontconfig 目录)配置文件。

如下配置,默认使用 Courier 10 Pitch 字体,如果某个字符不存在,则将在 Microsoft YaHei 字体中需找该字符对应的字体:

<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <match target="font">
        <test name="lang" compare="contains">
            <string>ar</string>
        </test>
        <alias>
            <family>Courier 10 Pitch</family>
            <prefer>
                <family>Microsoft YaHei</family>
            </prefer>
        </alias>
    </match>
</fontconfig>

修改 monospace 字体

Changing monospace fonts system-wide

如下配置文件将 monospace 字体指向 Courier 10 Pitch 字体:

<match target="pattern">
    <test name="family" qual="any">
        <string>monospace</string>
    </test>
    <edit binding="strong" mode="prepend" name="family">
        <string>Font B</string>
    </edit>
</match>

参考文献

How to change the fallback font for missing languages? - Ask Ubuntu


推荐阅读