首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Linux/Unix 下 JVM 中文顯示完整配置指南:從 Headless 模式到字體安裝

     編輯:Java 相關知識

在無圖形介面的 Linux/Unix 伺服器上運行 Java 圖形程式(如 JFreeChart、JFreeReport)輸出中文,常面臨 HeadlessException、缺少中文字體、DISPLAY 異常等問題。本文提供從 JVM 參數、字體安裝、font.properties 配置到編碼編譯的完整解決方案。

核心問題分析

  • Headless 模式:伺服器無 X Window,AWT 需 -Djava.awt.headless=true,但會導致 Frame.getImage() 拋出 HeadlessException,建議改用 ImageBuffer。
  • 字體缺失:JRE 自帶字體不含中文,圖形輸出依賴伺服器端 JRE 字體,而非客戶端瀏覽器字體。
  • 編碼不匹配:類檔若非 gb2312 編譯,運行時讀入為 ISO-8859-1/UTF-8,後續轉換無效。

解決方案步驟

1. 啟用 Headless 模式

java -Djava.awt.headless=true -jar your-app.jar

2. 安裝中文字體到 JRE

字體檔(.ttf)來源:

  • Windows C:\Windows\Fonts(如 simsun.ttc、simhei.ttf)。
  • Microsoft 官方下載:中文字體包。
  • Linux X11 字體目錄:/usr/lib/X11/fonts/TrueType/。

複製到 $JRE_HOME/lib/fonts/ 目錄。

3. 產生 fonts.dir 索引

cd $JRE_HOME/lib/fonts
ttmkfdir > fonts.dir

檢查 fonts.dir 第一行數字為字體總數,後續每行格式:檔案名 -foundry-family-weight-...。

4. 配置 font.properties

JVM 搜尋順序:font.properties.zh_CN.GBK → font.properties.zh → font.properties。建議直接修改 font.properties。

參考 font.properties.zh.Turbo(TurboLinux 附帶),將其中無效字體條目(如 -tlc-song-medium-r-normal--*-%d-*-*-c-*-gbk-0)替換為 fonts.dir 中實際存在的字體編碼。

關鍵映射範例:

serif.plain.0=simsun.ttc -misc-sim sun-medium-r-normal--0-0-0-0-p-0-iso10646-1

5. 編譯時指定編碼

javac -encoding gb2312 YourClass.java

或在 Ant/Maven 中設定 encoding="gb2312",確保字串常量正確編碼。

Servlet/JSP 對比說明

Servlet/JSP 輸出字元流,由客戶端瀏覽器渲染字體,只需設定:

response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");

圖形程式則在伺服器端生成圖片,必須解決伺服器端字體問題,複雜度高得多。

常見坑點提醒

  • ttmkfdir 執行後必須檢查 fonts.dir 內容與 font.properties 引用一致。
  • 若仍出現問號/方框,優先檢查編譯編碼與運行編碼是否一致。
  • 部分舊版 JRE 需重啟應用才能載入新字體配置。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved