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

Java 中文亂碼終極解決方案:編碼轉換、字體配置與 javaw Bug 避坑指南

     編輯:Java 相關知識

亂碼根因:編碼不匹配

Java 內部用 UTF-16(Unicode),I/O 時按 file.encoding 系統屬性轉碼。中文亂碼本質是讀取時編碼 ≠ 寫入時編碼,或顯示字體不支持字符集。

核心編碼轉換模式

// 讀取:指定源編碼 → 內部 Unicode
String str = new String(bytes, "GBK"); // 或 ISO-8859-1, UTF-8

// 寫出:Unicode → 指定目標編碼
byte[] out = str.getBytes("UTF-8");

常用編碼:GBK(兼容 GB2312,推薦)、UTF-8(國際化首選)、ISO-8859-1(單字節,可作透明傳輸)。

JSP/Servlet 亂碼雙軌制

方案 A:全鏈路 GBK

<%@ page contentType="text/html;charset=GBK" pageEncoding="GBK" %>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
javac -encoding GBK *.java

方案 B:全鏈路 ISO-8859-1 + 手動轉碼

// 獲取參數
String param = new String(request.getParameter("p").getBytes("ISO-8859-1"), "GBK");
// 輸出
response.setContentType("text/html;charset=GBK");
out.write(new String("中文".getBytes("GBK"), "ISO-8859-1"));

切勿混用:要麼全鏈路 GBK/UTF-8,要麼全鏈路 ISO-8859-1 + 手動轉碼,混用必亂。

JDBC 數據庫中文

多數 JDBC 驅動默認 ISO-8859-1。讀寫統一轉碼:

// 讀
String val = new String(rs.getBytes("col"), "GBK");
// 寫
ps.setBytes(1, "中文".getBytes("GBK")); // 或 setString 後驅動內部按連接屬性轉碼

驅動差異大(如 i-net UNA 免轉碼),上線前必測。

Swing 字體配置:font.properties 遺址

JDK 1.2+ Windows 上自動檢測系統字體,無需手動覆蓋 font.properties。若 Linux/舊 JDK 需配置,複製 font.properties.zh 為 font.properties 並確認字體文件存在。

重磅坑:javaw.exe Locale Bug(JDK 1.4.x)

現象:命令行 java 正常顯示中文,JBuilder/IDE 內運行(調用 javaw)亂碼。
原因:javaw 強制使用英文 Locale,忽略系統設置(Bug ID: 4629351,Sun 宣稱修復但實際未修)。
解決:VM 參數強制指定 Locale 與編碼:

-Dfile.encoding=GBK -Ddefault.client.encoding=GBK -Duser.language=zh -Duser.region=CN

JBuilder 配置:Project Properties → Run → VM Parameters 添加上述參數。

總結檢查清單

  1. 源文件編碼(IDE/編譯器)= 項目約定編碼(建議 UTF-8)。
  2. 頁面/響應 Content-Type 聲明編碼 = 實際輸出編碼。
  3. 請求參數解碼(Tomcat 8+ 需 URIEncoding="UTF-8")。
  4. JDBC 連接 URL 附帶 characterEncoding=GBK(或 UTF-8)。
  5. IDE 運行配置注入 -Dfile.encoding=... 覆蓋 javaw 缺陷。
  6. 日誌框架(Log4j/Logback)輸出編碼一致。
亂碼不可怕,可怕的是鏈路不統一。建立團隊「編碼憲法」,全鏈路 UTF-8,工具鏈強制檢查,才是治本之道。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved