編碼鏈路
JSP (pageEncoding=UTF-8)
→ request.setCharacterEncoding("UTF-8")
→ Servlet getParameter
→ JDBC URL: jdbc:mysql://...?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
→ MySQL 表/庫/欄位 CHARSET=utf8mb4
關鍵配置
- JSP 頁面:`<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>`
- Servlet 過濾器/開頭:`request.setCharacterEncoding("UTF-8");` (必須在 `getParameter` 前)。
- JDBC 連接串:`useUnicode=true&characterEncoding=utf8` (或 `utf8mb4` 支持 Emoji)。
- 數據庫:`CREATE DATABASE db CHARSET utf8mb4; ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4;`
排查步驟
- 檢查控制台 `System.out.println(name)` 是否已亂碼 → 是則問題在請求解碼階段。
- 檢查 MySQL `SELECT HEX(col) FROM t` 存儲字節 → 正確 UTF-8 中文為 3 字節 (如 E4B8AD)。
- 排除連接池配置覆蓋編碼參數。