修复 Ubuntu 英文环境汉字显示

Ubuntu 16.04 中默认中文字体从文泉驿换为了 Noto Sans CJK,但在英文的系统环境下的汉字显示不正确,部分汉字被显示为日文汉字形式。若将 LC_CTYPE 修改为 zh_CN.UTF-8,会导致系统英文字体也回退到中文配置的英文字体下。

Ubuntu 中字体文件夹位置可以在 /etc/font/fonts.conf 中找到,自定义新增字体可以保存在这些地方:

1
2
3
4
5
6
7
<!-- Font directory list -->

<dir>/usr/share/fonts</dir>
<dir>/usr/local/share/fonts</dir>
<dir prefix="xdg">fonts</dir>
<!-- the following element will be removed in the future -->
<dir>~/.fonts</dir>

上述后两者指的是用户目录下的字体文件夹所在, xdg 前缀一般指的是 /home/u/.config

通过对 $XDG_CONFIG_HOME/fontconfig/fonts.conf 的修改可以完成对某个用户的配置, 而对 /etc/fonts/local.conf 的修改则可以完成对每一位用户的配置。如果用户的单独配置和全局配置不同,系统优先使用前者。这些文件共用相同的语法。

Note:配置文件和目录: ~/.fonts.conf~/.fonts.conf.d~/.fontconfig/*.cache-* 从fontconfig 2.10.1开始已经被废弃( upstream commit),未来的版本也不会默认读取这些文件当作配置依据。分别用 $XDG_CONFIG_HOME/fontconfig/fonts.conf$XDG_CONFIG_HOME/fontconfig/conf.d$XDG_CACHE_HOME/fontconfig/*.cache-* 来代替。

via Font configuration (简体中文) - ArchWiki - Arch Linux

注释指明 ~/.fonts 元素将来会被移除,经过测试现在 ~/.fonts 可用,倒是第三项在刷新字体缓存的时候并不扫描该目录,将字体保存到 /home/u/.config/fonts 下并不能生效:

1
2
3
4
5
6
7
8
...
/usr/share/fonts/type1/gsfonts: caching, new cache contents: 35 fonts, 0 dirs
/usr/local/share/fonts: caching, new cache contents: 0 fonts, 0 dirs
/home/mo/.local/share/fonts: skipping, no such directory
/home/mo/.fonts: caching, new cache contents: 9 fonts, 0 dirs
Re-scanning /usr/share/fonts: caching, new cache contents: 0 fonts, 5 dirs
Re-scanning /usr/share/fonts/X11: caching, new cache contents: 0 fonts, 4 dirs
...

至于当前用户的字体配置文件,在 /home/u/.config/fontconfig/conf.d 文件夹下。英文环境下日语汉字优先于中文汉字显示的原因是由于 /etc/fonts/conf.avail/64-language-selector-prefer.conf 文件中的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<alias>
<family>sans-serif</family>
<prefer>
<family>Noto Sans CJK JP</family>
<family>Noto Sans CJK SC</family>
<family>Noto Sans CJK TC</family>
</prefer>
</alias>
<alias>
<family>monospace</family>
<prefer>
<family>Noto Sans Mono CJK JP</family>
<family>Noto Sans Mono CJK SC</family>
<family>Noto Sans Mono CJK TC</family>
</prefer>
</alias>
</fontconfig>

Noto Sans CJK JP 的优先级在 Noto Sans CJK SC 之前,重新调整一下它们的顺序即可,可以将新配置文件保存在用户主目录之下, /home/u/.config/fontconfig/conf.d/64-language-selector-prefer.conf

1
2
3
4
5
...
<family>Noto Sans Mono CJK SC</family>
<family>Noto Sans Mono CJK TC</family>
<family>Noto Sans Mono CJK JP</family>
...