跳至主要内容

Linux Java 中文字型設定

在 Linux 環境下安裝中文字型

  • Ubuntu/Debian
  • 例如安裝: Google Noto Sans CJK

安裝到個人用戶目錄

  • 在家目錄下建立一個 .fonts 目錄(注意最前面有一個 ' . ',代表它是一個隱藏目錄)
  • 將要使用到的字型檔案複製到 ~/.fonts 目錄下
  • 執行 fc-cache 更新字型快取
  • 執行 fc-list 確認安裝狀況
    mkdir -p ~/.fonts
cp *.otf ~/.fonts/

fc-cache -fv
fc-list | grep "Noto Sans CJK"

安裝到全系統字型路徑

  • 讓 Linux 中所有的使用者都能夠使用新增的字型
    • 以 root 權限執行
    • /usr/share/fonts/truetype 下,建立一個目錄
    • 將要使用到的字型檔複製到 /usr/share/fonts/truetype 下剛建立的目錄中
    • 執行 fc-cache 更新字型快取
    • 執行 fc-list 確認安裝狀況
    sudo mkdir -p /usr/share/fonts/truetype/noto
sudo cp *.otf /usr/share/fonts/truetype/noto/

fc-cache -fv
fc-list | grep "Noto Sans CJK"

Linux 下為 Java 設定中文字型  

Java 使用自己的字型設定檔。所以讓 Java 直接識別系統字型,也可以修改 Java 字型對應設定。

  • 為了讓 Swing, AWT, PDF 輸出, JFreeChart 等能正確顯示中文

建立目錄: fonts.fallback

    mkdir $JAVA_HOME/jre/lib/fonts/fallback 

複製字型檔到 fallback 中

  • 以儷黑體字型檔 lihei.ttf 為例:
    cp lihei.ttf $JAVA_HOME/jre/lib/fonts/fallback 

sudo chmod 644 lihei.ttf

安裝 xfonts-utils 套件

  • 安裝 xfonts-utils 套件
  • 在 fallback 目錄下建立 fonts.dir 與 fonts.scale 檔
    • 相關指令:
    • mkfontscale
    • mkfontdir
    sudo apt install xfonts-utils

-- 下列指令包含在 xfonts-utils 套件之內
sudo mkfontscale

sudo mkfontdir

將 fonts.scale 的內容附加到父目錄的 fonts.dir

  • 完成後須重啟 Java Process
    cat fonts.dir >> ../fonts.dir

Linux 下為 Java 設定中文字型: Java 的字型對應

確認作業環境下是否有中文字型

  • JVM 預設會由 jdk/jre/lib/fontconfig.bfc 載入 uming.ttf
    • uming.ttf - 悠明
    • ukai.ttf - 文鼎
    • NotoSansCJKtc-Regular.otf - Noto Sans CJK

查看是否有其他字型

    ls /usr/share/fonts/TrueType/chinese/*.ttf
sudo find / -name *.ttf

更改 Java 字型對應檔

  • $JAVA_HOME/jre/lib/fontconfig.properties.*

依實際情形加入相關設定

  • filename.google_font=NotoSansCJKtc-Regular.otf
    sequence.allfonts=alphabetic,google_font

filename.google_font=NotoSansCJKtc-Regular.otf

alias.google_font=Noto Sans CJK TC

fontconfig.properties 介紹  

  • fontconfig.properties: Java 用來管理字型映射與選擇的設定檔
  • 預設設定檔位置:
    • $JAVA_HOME/lib/fontconfig.properties
    • $JAVA_HOME/lib/fontconfig.properties.<locale>

設定檔範例

  • 三個關鍵字:
  • sequence : Java 在特定 Language Group 將選擇使用的字型順序。
  • filename : 若有非預設的字型檔,可由 filename 指定設定時的別名,以縮短含路徑全名。
  • alias : 藉由字型檔別名,將字型檔與作業系統中的 Font Family 建立關聯。

sequence.allfonts=alphabetic,google_font
sequence.zh_tw=alphabetic,trc_font_1,trc_font_2

filename.google_font=NotoSansCJKtc-Regular.otf
filename.trc_font_1=xxx.ttf
filename.trc_font_2=yyy.otf

alias.google_font=Noto Sans CJK TC

搜索順序 sequence

syntax

    sequence.<group-name>=<fontFile1,fontFile2,...>

範例
sequence.allfonts=alphabetic,uming,lihei
  • sequence : 關鍵字 - Java 查找字型時的查找順序設定用
  • group-name : 語言群組 Language Group,特定語言或文字系統所需字型的集合名稱。可以自行定義。
  • fontlist : 語言代號集合。有內建的代號,也可自行定義代號。
    • 內建例如: alphabetic, japanese
    • 自定義語言代號需搭配 filename 指向特定字型檔: 如 filename.lihei=lihei.ttf
  • 範例說明
    • allfonts : 語言群組
    • alphabetic,uming,lihei : 語言代號清單
    • 設定檔中可以有多個 sequence 設定,依序查找。
      • 上述範例意思為: 先以 alphabetic 顯示,弱無法顯示改找 uming,再找 lihei。

語言代號與字型檔關聯設定 filename

  • 非預設的字型檔,可以取一個別名。並附加至指定的 語言群組。

syntax

    filename.<alias>=<fontfile>

範例
filename.google_font=NotoSansCJKtc-Regular.otf
  • filename : 關鍵字 - 定義自訂語言代號
  • fontfile : 字型檔路徑
  • alias : 別名,設定語言群組時使用
  • 範例說明 : 以 google_font 做為路徑(字型檔) NotoSansCJKtc-Regular.otf 的別名

字型作業系統歸類分組 alias

  • alias : 關鍵字 - 將自定的語言代號 my_alias 歸到 真實的字型分類 (字型本身在作業系統中的名字)
  • my_alias : 某個自行安裝的字型
  • font_family_name : my_alias 在作業系統中的顯示名稱。實際名稱內嵌於字型檔案內、系統已定義,此處只是將自行安裝的字體歸類用。

syntax

    alias.<my_alias>=<font_family_name>

範例
alias.google_font=Noto Sans CJK TC

Java 測試範例

    import javax.swing.*;

public class TestChineseFont {
public static void main(String[] args) {
JFrame frame = new JFrame("中文測試");
JLabel label = new JLabel("顯示中文測試:你好 許功蓋 !");
label.setFont(new java.awt.Font("Noto Sans CJK TC", java.awt.Font.PLAIN, 18));

//fallback process
//label.setFont(new java.awt.Font("Serif", java.awt.Font.PLAIN, 18));
frame.add(label);
frame.setSize(400, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}

關於 Font 類別的建構子

Font 類別的建構子: family

  • 上方範例是直接填寫 Font Family 所以不經由 fontconfig.properties 處理。 直接找內建字型列表 (fc-list)
    Font font = new Font("Noto Sans CJK TC", Font.PLAIN, 14);

Font 類別的建構子: generic name

  • 未指定字型或指定 generic name 情境
  • 會進入 fallback mapping 流程。
    1. 檢查 fontconfig.properties 中的 sequence.allfonts 順序
    2. 根據字元的 Unicode 分配語言群組
    3. 對應該群組的字型檔案與字型家族
    4. 套用對應字型顯示
    Font font = new Font("Serif", Font.PLAIN, 14);

中文參考字型

    wget https://noto-website-2.storage.googleapis.com/pkgs/NotoSansCJKtc-hinted.zip

unzip NotoSansCJKtc-hinted.zip