瀏覽器、Server、資料庫、檔案儲存編碼任一環節不一致即亂碼。99% 的產品支援中文完美,**亂碼全因開發者對國際化/編碼認知不足**。
IDE/編輯器儲存編碼必須與頁面宣告一致。
操作:Notepad 另存新檔選編碼;Eclipse:Preferences → Content Types → Default Encoding → Update。
SetCharacterEncodingFilterweb.xml 關鍵配置:<filter-mapping>
<filter-name>SetCharacterEncoding</filter-name>
<url-pattern>*.do</url-pattern> <!-- 必須映射 *.do,非 * -->
</filter-mapping>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
避坑:
url-pattern用*僅解決 JSP,Struts*.do繞過 Filter → Action 亂碼。
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
native2ascii 轉義xmlhttp.setRequestHeader("Content-Type", "text/html"); // 缺 charset
// 請求端
xmlhttp.setRequestHeader("Content-Type", "text/html;charset=UTF-8");
// 回應端
response.setContentType("text/xml");
response.setCharacterEncoding("UTF-8");
XMLHttpRequest 可視為「動態生成的臨時頁面」,同樣需完整 Content-Type。JSP 頁首指令最終編譯為 response.setContentType() + setCharacterEncoding()。
| 環節 | 關鍵動作 |
|---|---|
| 檔案儲存 | IDE 統一 UTF-8 |
| JSP 頁面 | pageEncoding + contentType 雙聲明 |
| Filter | 映射 *.do,encoding=UTF-8 |
| 資源檔 | native2ascii 轉義 |
| JS 檔 | 儲存編碼 = 頁面編碼 |
| AJAX 請求 | setRequestHeader 含 charset |
| AJAX 回應 | response.setContentType + setCharacterEncoding |
| 資料庫連線 | JDBC URL 附 useUnicode=true&characterEncoding=UTF-8 |