Struts 1.x 專案在 Eclipse 中常遇三類亂碼,本文給出針對性解決方案,覆蓋資源檔、表單提交、資料庫讀取全鏈路。
原因:Properties 檔案規範要求 ISO-8859-1 編碼,中文需 Unicode 轉義 (\uXXXX),Eclipse 預設不轉義。
解決:安裝 Properties Editor 插件(Eclipse Marketplace 搜尋安裝),編輯 .properties 時自動雙向轉換中文 ⇄ Unicode,所見即所得。
原因:Tomcat 預設用 ISO-8859-1 解碼請求參數,瀏覽器實際發送 UTF-8/GBK。
解決:配置 CharacterEncodingFilter (Tomcat 內建 filters.SetCharacterEncodingFilter):
<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>
原理:Filter 在請求進入 Action 前調用 request.setCharacterEncoding(encoding),強制指定解碼字集。
原因:JDBC 驅動預設用 ISO-8859-1 讀取字節,實際資料庫存儲為 GB2312/GBK/UTF-8。
解決:在 Java 代碼中手動轉碼 (以 GB2312 為例):
while (rs.next()) {
String col1 = rs.getString(1);
String col2 = rs.getString(2);
String col3 = rs.getString(3);
// 關鍵:先按 ISO-8859-1 取回字節陣列,再按實際編碼構建字串
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");
// 後續使用 col1/col2/col3 即為正確中文
}
更佳方案:JDBC URL 加入 characterEncoding=GBK (MySQL) 或 useUnicode=true&characterEncoding=UTF-8,驅動層自動轉碼,代碼零侵入。
| 亂碼來源 | 核心原因 | 解決關鍵 |
|---|---|---|
| 資源檔 | Properties 規範限制 | Properties Editor 插件自動 Unicode 轉義 |
| 表單提交 | Tomcat 預設 ISO-8859-1 解碼 | CharacterEncodingFilter 強制 request.setCharacterEncoding |
| 資料庫讀取 | JDBC 驅動預設 ISO-8859-1 讀取 | 手動轉碼 或 JDBC URL 指定 characterEncoding |
徹底解決亂碼核心原則:全鏈路統一字集 (建議 UTF-8)——JSP pageEncoding、HTML meta charset、JS 檔案編碼、Filter encoding、資料庫/表/欄位 charset、JDBC URL characterEncoding、JVM -Dfile.encoding=UTF-8。