问题描述
我们常用的字体有 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 字体中需找该字符对应的字体:
通过 <edit> 实现
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<match target="pattern">
<test name="family" qual="any">
<string>Monaco</string>
</test>
<edit name="family" mode="append" binding="strong">
<string>DejaVu Sans Mono</string>
<string>WenQuanYi Micro Hei Mono</string>
<string>Symbola</string>
</edit>
</match>
</fontconfig>
通过 <alias> 实现
<?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <fontconfig> <alias> <family>sans-serif</family> <prefer> <family>Courier 10 Pitch</family> <family>Microsoft YaHei</family> </prefer> </alias> </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
linux – Changing font family for characters of a certain language/script using fontconfig? – Unix & Linux Stack Exchange