系统:deepin v20.8
使用 rime 中州韵的过程中,我发现有些字符无法显示,如“𠱞”。之前使用小狼毫的时候,没有这个问题。一问,原来是 win 除了微软雅黑之外,还使用了一个新细明体作为 fallback 字体,能够接住这个生僻字。而 deepin 上并不自带字库更大的 fallback 字体,需要手动配置。
到网上转了一圈才大概梳理出一点头绪,这里整理一下:
首先在网上下载需要的字体,这里我们使用花园明朝(HanaMin),这是一款免费字体,几乎囊括全汉字字库。(我在这只使用了 HanaMinA.ttf 与 HanaMinB.ttf)
来到
~/.config/fontconfig/conf.d/
路径,这里存放着用户的字体配置文件。我的路径下只有99-deepin.conf
这一项,于是我直接在里面修改了。该文件是 xml 格式文件,内容如下:
xml
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<match target="pattern">
<test qual="any" name="family">
<string>serif</string>
</test>
<edit name="family" mode="assign" binding="strong">
<string>Noto Sans CJK SC</string>
<string>Noto Sans</string>
<string>HanaMinA</string>
<string>HanaMinB</string>
</edit>
</match>
<match target="pattern">
<test qual="any" name="family">
<string>sans-serif</string>
</test>
<edit name="family" mode="assign" binding="strong">
<string>Noto Sans CJK SC</string>
<string>Noto Sans</string>
<string>HanaMinA</string>
<string>HanaMinB</string>
</edit>
</match>
<match target="pattern">
<test qual="any" name="family">
<string>monospace</string>
</test>
<edit name="family" mode="assign" binding="strong">
<string>Noto Mono</string>
<string>Noto Mono</string>
</edit>
</match>
<match target="font">
<edit name="rgba"><const>rgb</const></edit>
</match>
</fontconfig>
第一眼我也不懂,好在有 chatgpt。大概就是每一个match
块对应着一种 font-family 的渲染模式,譬如第一块是衬线字体的渲染方式,edit
内部定义了衬线字体的渲染优先级,即先用 Noto Sans CJK SC 渲染衬线字体,否则到 Noto Sans 中寻找,以此类推。我在后面添加上了 HanaMinA 与 HanaMinB 接住前面二者的漏网之字。后面的无衬线和等宽字体同上配置。[3]
- 保存并重启,“𠱞”字就能顺利渲染了。
参考资料:
linux 的字体渲染由 fontconfig 这个库管理,一般配有 GUI 界面的 linux 发行版自带该库。详见archlinux wiki 字体配置 ↩︎