瀏覽器、Server、資料庫、檔案儲存編碼任一環節不一致,即產生亂碼。常見編碼:
IDE/編輯器儲存編碼(ANSI/UTF-8)必須與頁面宣告編碼一致。
操作:Notepad「另存新檔」選編碼;Eclipse:Preferences → Content Types → Default Encoding → Update。
SetCharacterEncodingFilter(webapps/jsp-examples/WEB-INF/classes/filters)web.xml 配置:<filter>
<filter-name>SetCharacterEncoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SetCharacterEncoding</filter-name>
<url-pattern>*.do</url-pattern> <!-- 關鍵:Struts 擴展名,非 * -->
</filter-mapping>
避坑:
url-pattern用*只能解決 JSP,Struts 的*.do請求會繞過 Filter,導致 Action 亂碼。
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
contentType:告訴瀏覽器回應編碼 → 生成 response.setContentType() + setCharacterEncoding()pageEncoding:告訴 JSP 編譯器原始檔編碼 → 影響生成的 Servlet ClassProperties 檔儲存為 UTF-8,並用 native2ascii 轉換中文為 Unicode 轉義序列(\uXXXX),確保 JVM 正確讀取。
JS 檔儲存編碼 = 引用頁面編碼。若不一致,中文常數/訊息將亂碼。建議全專案統一 UTF-8。
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 聲明。Servlet 回應同理,JSP 頁首指令最終編譯為這兩行代碼。
| 環節 | 關鍵動作 |
|---|---|
| 檔案儲存 | IDE 統一設為 UTF-8 |
| JSP 頁面 | pageEncoding + contentType 雙聲明 |
| Filter | 映射 *.do,init-param encoding=UTF-8 |
| 資源檔 | native2ascii 轉義 |
| JS 檔 | 儲存編碼 = 頁面編碼 |
| AJAX 請求 | setRequestHeader 含 charset |
| AJAX 回應 | response.setContentType + setCharacterEncoding |
| 資料庫連線 | JDBC URL 附 useUnicode=true&characterEncoding=UTF-8 |