快轉到主要內容

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

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

本文解說如何透過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-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 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>
  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如何連接Apple AirPods Pro藍牙耳機並查看電量
分類   Linux系統 Linux使用技巧
標籤   AirPods GNOME Ubuntu KDE Plasma PipeWire
想安裝deb卻變成Snap?Ubuntu防止APT安裝Snap套件的解決方案
分類   Linux系統 Linux使用技巧
標籤   Ubuntu Snap

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

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