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

Java/J2EE中文亂碼根治方案:統一UTF-8編碼全鏈路配置

     編輯:Java 程式設計入門

中文亂碼本質是編碼不一致。Java內部用UTF-16,I/O按OS默認編碼。跨平台、多組件鏈路下,必須全鏈路強制指定UTF-8。

亂碼產生鏈路

瀏覽器(OS編碼) → Request → Servlet/JSP(OS編碼) → JVM(UTF-16) → 業務邏輯
                                    ↓
                              數據庫(各自編碼)
                                    ↓
                              Response(OS編碼) → 瀏覽器

任意環節編碼不匹配即產生亂碼。

三種失敗策略

  1. String字節轉換:破壞封裝,到處new String(bytes, "GBK"),不可維護
  2. 容器級編碼配置:遷移即失效,違反J2EE容器與應用分離原則
  3. 指定ISO-8859-1/GBK:綁定特定OS,喪失跨平台性

根治方案:全鏈路UTF-8

1. 開發編譯階段

IDE項目編碼設置為UTF-8(Eclipse:Properties→Resource→Text file encoding;IntelliJ:Settings→File Encodings)。

2. Web請求/響應

Filter統一設置(最早執行):

public class EncodingFilter implements Filter {
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        chain.doFilter(req, resp);
    }
}

web.xml配置<filter-mapping>覆蓋所有/*。

3. JSP頁面聲明

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

4. 數據庫連接

MySQL JDBC URL:

jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8

Oracle/PostgreSQL/SQL Server均有相應連接屬性或Session參數設置UTF-8。

5. 其他I/O

  • 文件讀寫:new InputStreamReader(new FileInputStream(f), "UTF-8")
  • XML處理:確保XML聲明<?xml encoding="UTF-8"?>,解析器默認UTF-8
  • 屬性文件:Java 9+Properties.load(Reader)指定編碼

驗證清單

  1. 頁面顯示正常
  2. 表單提交中文入庫正確
  3. 數據庫查詢工具顯示正常
  4. 日誌文件中文可讀
  5. 跨OS部署(Windows→Linux)無需改代碼

框架兼容性

Struts 2、Spring MVC、Tapestry、Hibernate、Jdon等主流框架均無縫支持UTF-8全鏈路,一次配置終身受益。

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