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

Spring + Hibernate 中文亂碼終極解決方案

     編輯:Java 相關知識

問題背景

在使用 Spring 整合 Hibernate 進行中文數據持久化時,亂碼問題是開發者常遇到的棘手難題。本文總結了兩種行之有效的解決方案,並分析其核心原理。

方案一:統一使用 GB2312 編碼(推薦用於舊系統)

數據庫層面配置

  1. 進入 MySQL 控制台:mysql --default-character-set=gb2312 -u root -p
  2. 建表時指定字符集:CREATE TABLE ... DEFAULT CHARACTER SET gb2312;
  3. 若表已存在,需重建或轉換編碼。

Spring 數據源配置

<property name="url">
    <value>jdbc:mysql://localhost/struts?useUnicode=true&characterEncoding=gb2312</value>
</property>

關鍵點:連接串必須顯式指定 useUnicode=true 並設置 characterEncoding=gb2312,否則驅動程序無法正確處理中文編碼轉換。

方案二:應用層手動編碼轉換(適用於無法修改數據庫編碼的場景)

數據源配置

<property name="url">
    <value>jdbc:mysql://localhost/struts</value>
</property>

此時不指定字符集,由應用層負責編碼轉換。

通用編碼轉換工具類

無論採用哪種方案,在 JSP 接收請求參數時,通常都需要進行 ISO-8859-1 → GB2312 轉換(因為 Tomcat 默認按 ISO-8859-1 解碼 URL 參數):

public class EncodingUtil {
    public static String trans(String chi) {
        if (chi == null) return null;
        try {
            // 先按 ISO-8859-1 還原字節,再按 GB2312 解碼
            byte[] temp = chi.getBytes("ISO-8859-1");
            return new String(temp, "GB2312");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return chi;
        }
    }
    public static String trans(Object obj) {
        return obj == null ? null : trans(obj.toString());
    }
}

使用示例:

String name = EncodingUtil.trans(request.getParameter("name"));

核心原理深度解析

亂碼本質是編碼與解碼不一致導致的字節序列錯誤解讀。流程如下:

  1. 瀏覽器按頁面編碼(如 UTF-8/GB2312)將中文編碼為字節發送。
  2. Tomcat 默認按 ISO-8859-1 解碼字節為 Java 字符串(此時已產生錯誤字符)。
  3. 應用需先按 ISO-8859-1 還原原始字節,再按真實編碼(GB2312/UTF-8)重新解碼。
  4. 持久化時,Hibernate 通過 JDBC 驅動將字符串按連接串指定編碼轉為字節寫入數據庫。

方案一在數據庫、連接池、應用層統一編碼,鏈路最短;方案二在應用層手動修正,靈活但易遺漏。

最佳實踐建議

  • 新項目首選 UTF-8:數據庫、表、連接串、頁面、JSP、Java 文件全鏈路 UTF-8,徹底避免編碼地獄。
  • Tomcat 8+ 可在 server.xml 的 Connector 添加 URIEncoding="UTF-8" 解決 GET 參數亂碼。
  • 使用 Spring 的 CharacterEncodingFilter 統一強制請求/響應編碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved