Struts 專案中文亂碼是困擾開發者的經典問題,通常集中在三大場景:資源檔案中文顯示、表單輸入中文、資料庫讀取中文。本文提供經實戰驗證的完整解決方案,基於 Eclipse 環境與 Tomcat 容器。
Properties 檔案預設以 ISO-8859-1 編碼儲存,中文需轉 Unicode 轉義序列(如 \u4e2d\u6587),直接寫入中文會導致讀取錯誤。
https://propedit.sourceforge.jp/eclipse/updates/.properties 檔案時自動處理中文 ↔ Unicode 轉換此外掛讓開發者直接編寫中文,儲存時自動轉義,讀取時自動還原,徹底消除手工 native2ascii 的痛苦。
HTTP 請求參數預設以 ISO-8859-1 解碼,POST 請求體中文會被錯誤解碼為亂碼。
最簡單方式:複用 Tomcat 內建 filters.SetCharacterEncodingFilter,在 web.xml 配置:
<filter>
<filter-name>SetCharacterEncoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SetCharacterEncoding</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
web.xml 首個 filter-mapping 之前定義,確保最早攔截pageEncoding、資料庫連線編碼、瀏覽器提交編碼全鏈路一致server.xml Connector 設定 URIEncoding="UTF-8"JDBC 驅動以 ISO-8859-1 讀取資料庫中文欄位,導致位元組錯誤解碼。
while (rs.next()) {
String col1 = rs.getString(1);
String col2 = rs.getString(2);
String col3 = rs.getString(3);
float col4 = rs.getFloat(4);
// 關鍵轉碼:ISO-8859-1 位元組 → GB2312 字串
col1 = new String(col1.getBytes("ISO-8859-1"), "GB2312");
col2 = new String(col2.getBytes("ISO-8859-1"), "GB2312");
col3 = new String(col3.getBytes("ISO-8859-1"), "GB2312");
}
在 JDBC URL 指定字元編碼,避免應用層手動轉碼:
jdbc:mysql://host/db?useUnicode=true&characterEncoding=GBKNLS_LANG 環境變數或 oracle.jdbc.defaultNChar?charSet=GBK連線層面統一編碼更簡潔、效能更佳、避免開發者遺漏轉碼。
| 層級 | 配置項 | 建議值 |
|---|---|---|
| JSP 頁面 | pageEncoding / contentType charset | UTF-8 |
| HTTP 請求 | CharacterEncodingFilter | UTF-8 |
| Tomcat Connector | URIEncoding | UTF-8 |
| JDBC 連線 | characterEncoding / charSet | UTF-8 |
| 資料庫表/欄 | CHARSET / COLLATION | utf8mb4 / utf8mb4_unicode_ci |
| Java 來源檔 | IDE 編碼設定 | UTF-8 |
統一採用 UTF-8 可支援全字元集,避免 GBK 字元集不足導致罕見字錯誤。