<match>
<test compare="contains">
<string>zh-cn</string>
</test>
<test>
<string>sans-serif</string>
</test>
<edit mode="prepend">
<string>Noto Sans CJK SC</string>
</edit>
</match>
<match>
<test compare="contains">
<string>zh-tw</string>
</test>
<test>
<string>sans-serif</string>
</test>
<edit mode="prepend">
<string>Noto Sans CJK TC</string>
</edit>
</match>
<match>
<test compare="contains">
<string>jp</string>
</test>
<test>
<string>sans-serif</string>
</test>
<edit mode="prepend">
<string>Noto Sans CJK JP</string>
</edit>
</match>
</fontconfig>
同时也要注意在 /etc/fonts/conf.d 目录中将其他 65 开头含有 nonlatin 字样的字体配置文件中 Noto Sans CJK 字体或者 Noto Sans Mono CJK 字体优先级排到最高。为了能够使 hint 设置最终有效,还要在 /etc/fonts 目录下创建一个 local.conf 文件(如果有则直接修改),具体内容如下:
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<match target="font">
<edit mode="assign">
<bool>false</bool>
</edit>
<edit mode="assign">
<bool>true</bool>
</edit>
<edit mode="assign">
<const>hintfull</const>
</edit>
</match>
</fontconfig>
对于 Java 程序而言,在 Linux 环境下其字体渲染总是比系统原生字体渲染效果要差。主要原因在于 Oracle 官方的 Java 内建了一套私有的字体渲染引擎,无法使用系统的 freetype 及 fontconfig 配置,且渲染效果比较差,属于和微软 cleartype 相似的渲染效果。OpenJDK 则采用的是 freetype 字体渲染引擎,但是默认并不读取系统 fontconfig 配置,且字体渲染的设置是固定的,也类似于微软 cleartype 效果,所以也不太理想。最好的办法就是,对 OpenJDK 源代码进行必要的修改,使之能够使用系统 freetype 字体渲染引擎的同时,能够读取当前系统 fontconfig 配置,并以此灵活调整 Java 中 freetype 的字体微调效果。如果自己编译 OpenJDK 的话难度较大,而 Infinality 已经提供了针对 freetype 及 fontconfig 优化编译打包好的 OpenJDK 软件包(目前基于 OpenJDK 8u92 版本代码),因此可通过 dnf 直接从 Infinality 软件源下载安装,使用下面的命令:
# dnf install --allowerasing java-1.8.0-openjdk-infinality-ultimate java-1.8.0-openjdk-infinality-ultimate-headless java-1.8.0-openjdk-infinality-ultimate-devel
其中,前两个软件包是 OpenJDK JRE 的必要软件包,最后一个软件包是 OpenJDK JDK 的必要软件包(如果用来做 Java 开发的话)。注意,不要安装java-1.8.0-openjdk-infinality-ultimate-accessibility 软件包,因为这个软件包是 OpenJDK 为 GTK+/GNOME ATK 组件提供的接口,而 ATK 已经被废弃了,如果安装了 java-1.8.0-openjdk-infinality-ultimate-accessibility 后会导致运行很多大型 Java Swing 程序出现错误(特别是在 Swing 使用 GTK+ 本地主题时)。Infinality 优化过的 OpenJDK 安装后,其具体位置及系统中多个 Java 如何切换当前环境变量的问题,可参考 Linux 下的 alternatives 命令及其使用说明,alternatives 命令是专门用于在 Linux 中为同时安装存在的同名但不同版本的多个软件进行切换使用而设计的,比如系统中同时安装了不同版本的 Java(JDK 或 JRE)就可以使用 alternatives 来进行当前使用版本的切换操作,很方便。
在安装完 OpenJDK 后,仍需要进行基本的 Java 内建字体规则配置,这么做的好处是定义好 Java 内建的 Dialog、DialogInput、Monospace 等逻辑字体与系统真实字体之间的映射关系,以便在 Java Swing 程序使用各种主题的时候,如果采用默认的逻辑字体可以按照我们的要求使用 google noto sans cjk 字体。OpenJDK 仍然采用 JRE 标准的 fontconfig.OS.properties 字体配置文件,其中 OS 为当前操作系统的名字,比如 Fedora、Ubuntu 等。这里给出一个 Fedora 24 下的参考配置,文件名为 fontconfig.Fedora.properties,必须放置在 jre/lib 目录下,注意这里的拉丁字符也采用 Noto Sans CJK 字体显示,避免 DejaVu Sans 混合显示导致行间距过小问题,内容如下: