中文亂碼本質是編碼與解碼字符集不匹配。全鏈路涉及:瀏覽器 → Tomcat → Servlet → Java 代碼 → 數據庫。任何一環不一致即產生亂碼。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

在讀取參數前設置:
request.setCharacterEncoding("UTF-8");

GET 參數在 URL 中,request.setCharacterEncoding 無效。兩種處理:
encodeURI("https://localhost/test?name=中文")<Connector URIEncoding="UTF-8"
port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
connectionTimeout="20000" disableUploadTimeout="true" />
只需添加 URIEncoding="UTF-8",重啟 Tomcat 即可。

在 web.xml 中第一個配置:
<filter>
<filter-name>charsetFilter</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>charsetFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
內部相當於對所有請求/響應強制:
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
| 層級 | 設置建議 |
|---|---|
| 數據庫 | CREATE DATABASE db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; |
| 表 | CREATE TABLE t (...) CHARSET=utf8mb4; |
| 列 | col VARCHAR(100) CHARACTER SET utf8mb4 |
| 連接串 | jdbc:mysql://...?characterEncoding=utf8&useUnicode=true |

<meta charset="UTF-8">URIEncoding="UTF-8"CharacterEncodingFilter(首位)request.setCharacterEncoding("UTF-8")(POST)utf8mb4characterEncoding=utf8request.setCharacterEncoding 能解決 GET 亂碼utf8 而非 utf8mb4(無法存 Emoji)統一全鏈路 UTF-8(推薦 utf8mb4),配合 Spring 過濾器與 Tomcat URIEncoding,可徹底根治中文亂碼問題。