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

Java 中文編程實戰:從編碼轉換到 JVM 參數調優的完整避坑指南

     編輯:Java 程式設計入門

前言:一場關於中文的「持久戰」

英文 Windows 2000 + 中文支援包、JBuilder 7 + JDK 1.3/1.4、JTextArea 顯示亂碼……這不僅是作者當年的真實經歷,更是無數 Java 開發者的共同記憶。本文將「編碼轉換原理」「字體配置」「JVM 參數調優」三大維度串聯,給出經得起生產環境驗證的解決方案。

一、編碼轉換核心原理

層面說明
Java 內部統一使用 UTF-16 (Unicode) 表示 char/String
I/O 邊界Reader/Writer 依 file.encoding 轉碼;InputStream/OutputStream 處理原始位元組
常用編碼UTF-8(推薦)、GBK(兼容 GB2312)、ISO-8859-1(單位元組透傳)

兩大實用轉碼手法

  1. 流層面指定編碼:
    // 讀取 GBK 檔案
    try (BufferedReader br = new BufferedReader(
            new InputStreamReader(new FileInputStream(file), "GBK"))) { ... }
    
    // 寫入 UTF-8
    try (PrintWriter pw = new PrintWriter(
            new OutputStreamWriter(new FileOutputStream(file), "UTF-8"))) { ... }
  2. 字串層面轉碼:
    // 正確姿勢:位元組陣列 → 指定編碼 → String
    String correct = new String(bytes, StandardCharsets.UTF_8);
    
    // 反例:預設編碼會隨平台變化
    String risky = new String(bytes); // 不要這樣寫

二、JSP/Servlet 中文處理「雙軌制」

方案 A:全鏈路 GBK(舊專案維護)

  • 編譯:javac -encoding GBK *.java
  • JSP 頁面:<%@ page contentType="text/html;charset=GBK" %>
  • 請求過濾器:request.setCharacterEncoding("GBK")

方案 B:全鏈路 UTF-8(新專案首選)

  • 編譯:javac -encoding UTF-8 *.java
  • JSP/響應:charset=UTF-8
  • Tomcat server.xml:<Connector URIEncoding="UTF-8" />
  • 資料庫 URL:?characterEncoding=UTF-8&useUnicode=true

鐵律:嚴禁混用兩套方案,否則必亂碼。

三、資料庫 JDBC 中文無痛方案

// MySQL 8.0+ 驅動自動識別 UTF-8,僅需確保:
// 1. 表/欄位 CHARSET=utf8mb4
// 2. 連線字串帶 useUnicode=true&characterEncoding=UTF-8
// 3. 程式碼端統一使用 UTF-8 字串,無需手動 getBytes 轉碼

四、字體配置:從 font.properties 到邏輯字型

  • JDK 1.1 時代需手動覆蓋 font.properties 映射中文字型。
  • JDK 1.2+ 引入邏輯字型(Dialog、SansSerif、Monospaced),自動根據 file.encoding 落地到物理字型。
  • 現代 Swing 應用無需修改字體配置檔,僅需確保作業系統安裝中文字型(如微軟雅黑、文泉驛)。

五、經典坑:javaw 的 Locale Bug (Bug ID 4629351)

現象:同一 JDK,java -jar app.jar 正常顯示中文,javaw -jar app.jar 卻顯示方塊/亂碼。

根因:javaw(無主控台模式)在 Windows 上預設使用英文 Locale,導致 file.encoding 回退為 Cp1252,邏輯字型映射失效。

終極修復:啟動參數強制指定中文 Locale 與編碼:

javaw -Dfile.encoding=GBK -Ddefault.client.encoding=GBK \
      -Duser.language=zh -Duser.region=CN -jar app.jar

在 JBuilder/IDE 中:Project Properties → Run → VM Parameters 填入上述參數即可。

六、總結檢查清單

  1. ☑ 專案源碼統一 UTF-8 儲存,編譯參數 -encoding UTF-8。
  2. ☑ Web 容器 URIEncoding="UTF-8",Filter 設定 request.setCharacterEncoding("UTF-8")。
  3. ☑ 資料庫連線 URL 攜帶 UTF-8 參數,表結構 utf8mb4。
  4. ☑ Swing/無主控台程式啟動加 -Dfile.encoding=UTF-8 -Duser.language=zh -Duser.region=CN。
  5. ☑ 杜絕程式碼中出現 new String(bytes)、getBytes() 無參呼叫。

遵循此清單,Java 中文問題將不再是「歷史遺留難題」,而是可控、可預期的工程配置項。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved