**原因**:未在 JSP 指定字符集,容器預設 ISO-8859-1 輸出,瀏覽器以其他編碼解析。
**解決**:頁面最頂端宣告:
<%@ page contentType="text/html; charset=UTF-8" language="java" pageEncoding="UTF-8" %>
**原因**:JDBC 連線未指定字符集,驅動程式預設編碼與資料庫不符。
**解決**:
jdbc:mysql://localhost/db?useUnicode=true&characterEncoding=UTF-8request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");**現象**:`` 在 `b.jsp` 用 `request.getParameter("name")` 取得亂碼。
// b.jsp
String name = request.getParameter("name");
name = new String(name.getBytes("ISO-8859-1"), "UTF-8");
**原理**:Tomcat 預設以 ISO-8859-1 解碼 URL 查詢字串,先還原位元組再按 UTF-8 解讀。
// a.jsp (前端)
var name = "中文";
name = encodeURIComponent(name); // UTF-8 編碼
location.href = "b.jsp?name=" + name;
// b.jsp (後端)
// Tomcat 8+ 預設 URIEncoding="UTF-8" 會自動正確解碼
String name = request.getParameter("name"); // 直接可用
**前提**:`server.xml` Connector 配置 `URIEncoding="UTF-8"`。
// 在讀取參數前
request.setCharacterEncoding("UTF-8"); // 僅對 POST 有效,GET 無效
// GET 必須靠 URIEncoding 或手動 ISO-8859-1 轉碼
**解決**:在讀取參數前設定請求編碼:
request.setCharacterEncoding("UTF-8");
或在 `web.xml` 配置過濾器全域處理:
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param>
<init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
| 場景 | 推薦方案 | 關鍵配置 |
|---|---|---|
| JSP 頁面輸出 | page 指令雙宣告 | `contentType="UTF-8" pageEncoding="UTF-8"` |
| POST 表單 / AJAX | 請求編碼過濾器 | `CharacterEncodingFilter` + `forceEncoding=true` |
| GET URL 參數 | 前端 encodeURIComponent + Tomcat URIEncoding | `encodeURIComponent()` + `URIEncoding="UTF-8"` |
| 資料庫讀寫 | JDBC URL 指定編碼 | `useUnicode=true&characterEncoding=UTF-8` |
| 舊系統維護 | 手動 ISO-8859-1 轉碼 | `new String(bytes, "ISO-8859-1")` → `getBytes("UTF-8")` |