Linux 桌面中文顯示涉及兩大字體子系統:Core X Font System(傳統)與 Fontconfig(現代)。Java(JDK/JRE/JBuilder)依賴 Fontconfig,但受系統字體安裝影響。本文提供經 Red Hat 9 實測的完整配置流程。
# 1. 建立字體目錄
mkdir -p /usr/share/fonts/local
# 2. 複製字體檔(如 simsun.ttc, tahoma.ttf)
cp *.ttf *.ttc /usr/share/fonts/local/
# 3. 產生字體索引
cd /usr/share/fonts/local
ttmkfdir -d . -o fonts.scale
cp fonts.scale fonts.dir # 必須複製,xfs 需要 fonts.dir
# 4. 加入字體路徑並重載
chkfontpath --add /usr/share/fonts/local
service xfs reload # 或 restart xfs,Red Hat 9 可能無 service 指令,改用:
# /etc/init.d/xfs restart
# 或登出 X 重新 startx
# 系統級安裝(需 root)
cp *.ttf *.ttc /usr/share/fonts/
fc-cache -fv
# 用戶級安裝(推薦,無需 root)
mkdir -p ~/.fonts
cp *.ttf *.ttc ~/.fonts/
fc-cache -fv ~/.fonts
驗證:fc-list | grep -i simsun 應顯示字體路徑。
# 編輯 /etc/gtkrc.zh_CN
fontset = "-microsoft-tahoma-medium-r-normal-*-*-120-*-*-p-*-viscii1.1-1,\
-misc-simsun-medium-r-normal-*-*-120-*-*-c-*-koi8-r"
格式:英文字體,中文字體,支援字體集合 fallback。
直接圖形介面選擇「應用程式字體」為 SimSun 10pt,效果最佳。
# 編輯 ~/.enlightenment/themes/你的主題/textclass.cfg
# 全域替換字體字串為:
-microsoft-tahoma-medium-r-normal-*-*-120-*-*-p-*-viscii1.1-1,\
-misc-simsun-medium-r-normal-*-*-120-*-*-c-*-koi8-r
# 重啟 E 生效
# /etc/profile 或 ~/.bash_profile
export JAVA_FONTS=/usr/share/fonts/local
# 或用戶字體目錄
# export JAVA_FONTS=~/.fonts
指向含 fonts.dir/fonts.scale 的目錄(Core X 目錄),而非 Fontconfig 快取目錄。
位置:$JAVA_HOME/jre/lib/font.properties(或 font.properties.zh_CN)
# 原始映射(範例)
serif.0=-b&h-lucidabright-medium-r-normal--*-%d-*-*-p-*-iso8859-1
serif.1=--standard symbols l-medium-r-normal--*-%d-*-*-p-*-urw-fontspecific
# 修改為中英文映射
serif.0=-microsoft-tahoma-medium-r-normal-*-*-120-*-*-p-*-viscii1.1-1
serif.1=-misc-simsun-medium-r-normal-*-*-120-*-*-c-*-koi8-r
serif.italic.0=-microsoft-tahoma-medium-r-normal-*-*-120-*-*-p-*-viscii1.1-1
serif.italic.1=-misc-simsun-medium-r-normal-*-*-120-*-*-c-*-koi8-r
# 同理修改 sansserif, monospaced, dialog, dialoginput 等邏輯字體
規律:*.0 為英文/拉丁字體,*.1 為中文/雙位元組字體。Java 依序嘗試 .0、.1... 直到找到支援字元的字體。
| 環境 | font.properties 位置 | 備註 |
|---|---|---|
| JBuilder | $JBuilder_HOME/jdk1.x/jre/lib/ | IDE 本身與專案執行環境分離,皆需修改 |
| J2SDK (javac/java) | $JAVA_HOME/jre/lib/ | 命令列編譯執行環境 |
| J2RE (java) | $JRE_HOME/lib/ | 純執行環境 |
最簡方式:修改好一份 font.properties,複製到所有環境對應目錄覆蓋原檔。
| 現象 | 原因 | 解決 |
|---|---|---|
| Java 程式顯示中文,但 IDE 介面亂碼 | JAVA_FONTS 指向 Fontconfig 目錄(無 fonts.dir/scale) | 指向 Core X 字體目錄(含 fonts.dir/scale) |
| 修改 font.properties 無效 | 邏輯字體名稱錯誤、未重啟 JVM、編碼聲明缺失 | 確認 serif/sansserif/monospaced 全修改,JVM 參數 -Dfile.encoding=UTF-8 |
| 部分中文顯示方塊/問號 | 字體缺字(SimSun 不含生僻字) | 安裝擴展字體(如 Noto Sans CJK、文泉驛微米黑)並加入映射 |
| JBuilder 專案輸出正常,但 IDE 選單亂碼 | JBuilder 自身 JDK 與專案 JDK 不同 | 修改 JBuilder 安裝目錄下 jre 的 font.properties |
# 1. 安裝開源中文字體(推薦)
# CentOS/RHEL
yum install -y google-noto-sans-cjk-fonts wqy-microhei-fonts
# Ubuntu/Debian
apt install -y fonts-noto-cjk fonts-wqy-microhei
# 2. 刷新字體快取
fc-cache -fv
# 3. Java 9+ 使用邏輯字體映射自動回退,通常無需修改 font.properties
# 若需強制指定,使用 $JAVA_HOME/conf/fontconfig.properties.src
# 參考:https://docs.oracle.com/javase/9/intl/font-configuration-files.htm
Linux Java 中文核心在於:系統安裝字體 → Fontconfig 識別 → JAVA_FONTS 指向正確索引目錄 → font.properties 映射邏輯字體。理解雙字體子系統差異、邏輯字體 fallback 機制,能舉一反三解決各類中文顯示疑難雜症。現代發布版搭配開源 CJK 字體,配置已大幅簡化。