現象:`GET /search?q=中文` 後端 `request.getParameter("q")` 取得亂碼。原因:Tomcat 8+ 預設 **URL 解碼用 UTF-8**,若前端頁面/表單為 GBK 編碼提交,解碼錯誤導致亂碼。
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="GBK" /> <!-- 或 UTF-8,與前端編碼一致 -->
| 環節 | 配置點 | 建議值 |
|---|---|---|
| 前端頁面 | `` / `<%@ page pageEncoding="..." %>` | UTF-8 (推薦) / GBK |
| 表單提交 | ` | 與頁面一致 |
| Tomcat Connector | `URIEncoding` | 與前端一致 |
| Servlet 讀取 | `request.setCharacterEncoding("...")` (POST 必須) | 與前端一致 |
| 資料庫連線 | `characterEncoding=...` (JDBC URL) | 與資料表字符集一致 |
| 資料表/欄位 | `CHARSET=...` | UTF-8 (utf8mb4) 推薦 |
`URIEncoding` **僅影響 GET 參數解碼**。POST 請求體解碼需在讀取參數**前**調用:
request.setCharacterEncoding("UTF-8"); // 或 GBK
String param = request.getParameter("q");
建議在 `Filter` (如 `CharacterEncodingFilter`) 統一設定,覆蓋全站。