快轉到主要內容

fontconfig調整Linux中文預設字型的優先順序,修正字型模糊、Emoji亂碼的問題

· 民國114年乙巳年
·
切換繁體/簡體
分類   Linux系統 Linux使用技巧
標籤   Fontconfig LibreOffice Freedesktop Specifications
目錄

本文解說如何透過fontconfig改善Linux中文字型的種種問題,包括字型優先順序(優先級)、用替代字型顯示另一個字型、修正模糊、解決Emoji無法顯示。

我原本是用Noto Sans CJK TC當Linux系統字型,發現Flatpak版Steam玩《Team Fortress 2》會無法顯示中文字型,裝了文泉驛正黑體才正常。可是一裝下去,Linux的中文字型優先順序就被覆蓋了,其他應用程式跟著變成採用文泉驛正黑體來顯示文字!

老實說文泉驛很難看,不適合當螢幕文字的呀。以前我還發生過裝「標楷體」,導致整個系統預設都是該字型,變超級醜的狀況。

此時解決方案有:

  1. 將該字型套件解除安裝。認真?夫所以養而害所養譬猶削足而適履。

  2. 強行在瀏覽器指定字型。我覺得不行,這會覆寫部份網站的設定,我的原則是只要瀏覽器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如何安裝Windows的標楷體

  1. 自由授權的字型可以透過Linux發行版套件管理器安裝,例如Noto Font字型家族:
sudo apt install fonts-noto fonts-noto-cjk fonts-noto-color-emoji
  1. 如果要手動安裝字型的話就是下載字型,點二下安裝。GNOME與KDE Plasma桌面應該都有「字型安裝器」的圖形界面能用,不需要指令。

  2. 指令安裝的話,就是將.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,此處採用第一種。

  1. 使用fc-list指令列出系統安裝的字型,裡面可以知道字型的名稱。

  2. 假設要讓所有應用程式優先使用Noto Sans CJK TC字型的話,新增fontconfig設定檔

mkdir -p ~/.config/fontconfig/

vim ~/.config/fontconfig/fonts.conf
  1. 填入以下內容。這裡設定系統要求使用sans-serif字型時,就優先使用Noto Sans,不行的話再用Noto Sans CJK TC,而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</string>
    <string>Noto Sans CJK TC</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</string>
    <string>Noto Serif CJK TC</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</string>
    <string>Noto Sans Mono CJK TC</string>
    <string>Noto Color Emoji</string>
  </edit>
</match>
</fontconfig>
  1. 設定完成後更新字型快取,重開用程式看看有無變更。
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

參考資料
#

相關文章

什麼是.desktop檔案?Linux桌面Desktop Entry用途解說
分類   Linux系統 Linux使用技巧
標籤   Freedesktop Specifications GNOME KDE Plasma
Ubuntu維持中文界面,將家目錄下的資料夾改成英文 (xdg-user-dirs-update用法)
分類   Linux系統 Linux使用技巧
標籤   Linux Freedesktop Specifications
無法開啟檔案?用Flatseal調整Linux Flatpak應用程式權限 & flatpak override用法
分類   Linux系統 Linux使用技巧
標籤   Flatpak Freedesktop Specifications

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。

(留言板載入中)這是Disqus留言板,您可能會看到Disqus強制投放的廣告。為防止垃圾內容,有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請善用圖床網站。