Java 中文亂碼問題由來已久,雖然網路上相關文章眾多,但許多說法未能釐清跨平台環境下的核心成因。本文將從 Java 編譯器與 JVM 的編碼/解碼機制切入,深入剖析主控台程式、Servlet、JSP 及 EJB 等不同場景下的中文處理難題,並給出經實戰驗證的最優解法。
早期作業系統僅支援單位元組編碼(如 ASCII),隨著全球化需求,Unicode 採用雙位元組編碼兼容各國文字。Java 內部統一使用 Unicode,但在輸入/輸出時必須與本地作業系統編碼(中文 Windows 常為 GBK/GB2312)互轉。這一轉換鏈路中任何一環出錯,都會導致亂碼。
Java「一次編寫,到處執行」的特性反而加劇了問題:在中文 Windows 開發、部署到英文 Linux 時,預設編碼不一致;瀏覽器傳遞參數多採用 UTF-8,而伺服器端若按 GBK 解碼,必會產生亂碼。
純英文作業系統與瀏覽器缺乏中文字型支援,直接運行含中文的程式或瀏覽中文網頁,同樣會出現顯示異常。
無論是主控台程式、JSP/Servlet 還是 EJB,其生命週期皆包含三階段:
javac 讀取源碼,若未指定 -encoding,會按 JVM 預設編碼(英文系統常為 ISO-8859-1)解碼,導致中文丟失或錯誤編入 .class。file.encoding 或程式指定編碼輸出至主控台、網頁或資料庫。javac -encoding GBK YourFile.java-Dfile.encoding=GBKOutputStreamWriter(out, "GBK") 顯式指定編碼。web.xml 配置 <filter> 統一設定 request.setCharacterEncoding("UTF-8")。response.setContentType("text/html;charset=UTF-8") 並確保 JSP 頁面指令 <%@ page contentType="text/html;charset=UTF-8" %>。?characterEncoding=UTF-8&useUnicode=true。<Connector URIEncoding="UTF-8" />。StandardCharsets.UTF_8)。Java 中文問題的本質是「編碼協議不一致」。採用「全鏈路 UTF-8 + 顯式指定編碼 + 統一容器配置」的三位一體策略,可在開發、測試、生產環境無縫遷移,實現真正的跨平台中文支援。