本文解說如何透過fontconfig改善Linux中文字型的種種問題,包括字型優先順序(優先級)、用替代字型顯示另一個字型、修正模糊、解決Emoji無法顯示。
我原本是用Noto Sans CJK TC當Linux系統字型,發現Flatpak版Steam玩《Team Fortress 2》會無法顯示中文字型,裝了文泉驛正黑體才正常。可是一裝下去,Linux的中文字型優先順序就被覆蓋了,其他應用程式跟著變成採用文泉驛正黑體來顯示文字!


老實說文泉驛很難看,不適合當螢幕文字的呀。以前我還發生過裝「標楷體」,導致整個系統預設都是該字型,變超級醜的狀況。
此時解決方案有:
將該字型套件解除安裝。認真?夫所以養而害所養譬猶削足而適履。
強行在瀏覽器指定字型。我覺得不行,這會覆寫部份網站的設定,我的原則是只要瀏覽器UI顯示跟系統一樣的字型,其他交給網站自行決定。
那麼,就透過撰寫fontconfig設定檔來指定系統應用程式要優先使用的字型吧。在設定完成後,系統就會優先使用Noto Sans來顯示界面文字了。
1. 了解Linux常用的中文字型#
使用fc-list
指令列出系統安裝的字型。
Linux系統常用的中文字型有:
- Noto Fonts CJK,內含TC/SC/HK/JP,分別對應正體字/簡體字/香港繁體/日文漢字。
Noto Sans
代表無襯線字,Noto Serif
代表襯線字。 - 思源黑體 (Adobe Source Hans)
- 文泉驛正黑體 (WQY Zhenhei)
- 楷體 (AR PL UKai),文鼎公司開發的自由授權字型
- 明體 (AR PL UMing),文鼎公司開發的自由授權字型
近年因表情符號盛行,多半還會裝個顯示Emoji的Noto Font Emoji
。
是的,Linux缺少很多Windows系統的字型,需要手動安裝。又因為很多字型的授權條款限制,Linux發行版的套件管理器無法收錄這些字型套件,所以你得手動下載字型檔。
- 自由授權的字型可以透過Linux發行版套件管理器安裝,例如Noto Font字型家族:
sudo apt install fonts-noto-cjk fonts-noto-color-emoji
如果要手動安裝字型的話就是下載字型,點二下安裝。GNOME與KDE Plasma桌面應該都有「字型安裝器」的圖形界面能用,不需要指令。
指令安裝的話,就是將.ttf檔放到
/usr/share/fonts/truetype/
,.otf放到/usr/share/fonts/opentype/
。再用fc-cache -fv
指令更新字型快取,其他程式方能使用,連Wine跑的程式都能存取。
2. fontconfig的設定檔位置#
Linux的字型目錄位於/usr/share/fonts/
或者~/.local/share/fonts/
。要手動安裝字型就是放到這裡。
fontconfig用於告訴系統要怎麼處理字型顯示。
要對系統全域生效的話就是修改 → /etc/fonts/local.conf
,不要編輯/etc/fonts/fonts.conf
要對個別使用者者生效的話就是修改 → ~/.config/fontconfig/fonts.conf
別亂動系統的/etc/fontconfig/fonts.conf
,該檔案fontconfig一更新就會遭覆蓋,這裡以個別使用者下去設定比較適當。
3. 優先使用特定字型顯示界面文字#
fontconfig有兩種處理字型的方式,一種是使用match pattern,另外一種是alias,此處採用第一種。
使用
fc-list
指令列出系統安裝的字型,裡面可以知道字型的名稱。假設要讓所有應用程式優先使用Noto Sans CJK TC字型的話,新增fontconfig設定檔
mkdir -p ~/.config/fontconfig/
vim ~/.config/fontconfig/fonts.conf
- 填入以下內容。這裡設定系統要求使用
sans-serif
字型時,就優先使用Noto Sans CJK TC
,不行的話再用Noto Sans
,而Emoji最後才會用到Noto Sans Emoji。其他字型以此類推。
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<!-- 設定讓system-ui使用Sans-serif字型 -->
<match target="pattern">
<test name="family">
<string>system-ui</string>
</test>
<edit name="family" mode="prepend" binding="strong">
<string>sans-serif</string>
</edit>
</match>
<!-- 預設sans-serif字型 -->
<match target="pattern">
<test name="family">
<string>sans-serif</string>
</test>
<edit name="family" mode="prepend" binding="strong">
<string>Noto Sans CJK TC</string>
<string>Noto Sans</string>
<string>Noto Color Emoji</string>
</edit>
</match>
<!-- 預設seriff字型 -->
<match target="pattern">
<test name="family">
<string>serif</string>
</test>
<edit name="family" mode="prepend" binding="strong">
<string>Noto Serif CJK TC</string>
<string>Noto Serif</string>
<string>Noto Color Emoji</string>
</edit>
</match>
<!-- 預設monospace字型 -->
<match target="pattern">
<test name="family">
<string>monospace</string>
</test>
<edit name="family" mode="prepend" binding="strong">
<string>Noto Sans Mono CJK TC</string>
<string>Noto Sans Mono</string>
<string>Noto Color Emoji</string>
</edit>
</match>
</fontconfig>
- 設定完成後更新字型快取,重開用程式看看有無變更。
fc-cache -fv
4. Flatpak程式吃不到系統中文字型設定#
根據Github的討論,儘管Flatpak應用程式可以使用系統字型,但卻不採納系統fonts.conf的設定,而是以自己的優先順序來顯示字型,有時候在Wayland下還會導致字型模糊(跟縮放無關)。
只要開放全部的Flatpak程式讀取xdg-config/fontconfig:ro
就行,等同允許讀取~/.config/fontconfig/
。
flatpak --user override --filesystem=xdg-config/fontconfig:ro