亂碼產生的三大核心環節
| 環節 | 關鍵設置 | 驗證方法 |
| 前端頁面 | <meta charset="UTF-8">、表單 accept-charset="UTF-8" | DevTools Network → Headers → Content-Type |
| Web 容器 | Tomcat server.xml URIEncoding="UTF-8"、web.xml CharacterEncodingFilter | 請求參數在 Filter 中打印 |
| 後端代碼 | Java request.setCharacterEncoding("UTF-8")、JSP pageEncoding="UTF-8" | Controller 入口打印參數 |
| 數據庫連接 | JDBC URL ?characterEncoding=utf8&useSSL=false、表/庫字符集 utf8mb4 | 插入後 SELECT HEX(col) 檢查字節 |
標準化配置清單
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
EncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
EncodingFilter
/*
server:
servlet:
encoding:
charset: UTF-8
force: true
enabled: true
jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
調試黃金法則:二分法定位
- 瀏覽器 Network 面板查看 Request Payload / Form Data 是否已經亂碼 → 是 → 前端/容器問題
- Controller 入口打印參數 → 亂碼 → 容器/Filter 問題
- Service 層打印 → 亂碼 → Java 代碼處理問題
- 數據庫查看 HEX 值 → 正確 → 讀取/顯示層問題;錯誤 → 寫入/連接層問題
常見誤區
- ❌ 以為設置了
meta charset 就萬事大吉(GET 請求 URL 編碼由瀏覽器決定,Tomcat 需 URIEncoding)
- ❌ 使用
new String(bytes, "ISO-8859-1") 強制轉碼(掩蓋症狀,不可維護)
- ❌ 數據庫字符集用
utf8 而非 utf8mb4(無法存 Emoji、生僻字)