June 6, 2016 · Linux

修复 Ubuntu 英文环境汉字显示

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

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

<!-- 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 下并不能生效:

...
/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 文件中的配置:

<?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

...
<family>Noto Sans Mono CJK SC</family>  
<family>Noto Sans Mono CJK TC</family>  
<family>Noto Sans Mono CJK JP</family>  
...
Comments powered by Disqus