中文亂碼根因在於瀏覽器、頁面、容器、JVM 多層編碼不一致。本文提供「統一編碼集、容器配置解碼、請求過濾器兜底」三層防線,徹底解決 GET/POST、HTML/JSP、Eclipse/Tomcat 多環境亂碼問題。
<meta charset="UTF-8"> <!-- HTML5 簡寫 -->
<!-- 或舊版 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
contentType:響應頭 Content-Type,告訴瀏覽器解碼方式。pageEncoding:JSP 文件本身保存編碼,編譯時讀取用。Eclipse 設置:Window → Preferences → General → Workspace → Text file encoding = UTF-8;Content Types → JSP → Default encoding = UTF-8。

修改 $CATALINA_HOME/conf/server.xml 中 <Connector>:
<Connector port="8080" protocol="HTTP/1.1"
URIEncoding="UTF-8"
useBodyEncodingForURI="true"
connectionTimeout="20000"
redirectPort="8443" />
Eclipse 內置 Tomcat 同步修改:Servers 視圖 → server.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>
Spring Boot 專案只需在 application.yml 設置:
server:
servlet:
encoding:
charset: UTF-8
force: true
enabled: true
request.setCharacterEncoding("UTF-8"); // 必須在 getParameter() 前調用
| 現象 | 可能原因 | 定位步驟 |
|---|---|---|
| POST 正常,GET 亂碼 | Tomcat 未配 URIEncoding | 檢查 server.xml Connector |
| 部署正常,Eclipse 運行亂碼 | Eclipse 內置 Tomcat 配置不同步 | Servers 視圖修改 server.xml |
| 頁面顯示亂碼,數據庫存儲正常 | 響應 Content-Type 缺失 charset | 檢查 page contentType / 過濾器 forceEncoding |
| 文件上傳文件名亂碼 | Multipart 解析器編碼未設置 | Commons FileUpload / Servlet 3.0 MultipartConfig |
-Dfile.encoding=UTF-8)。URIEncoding=UTF-8 + useBodyEncodingForURI=true。CharacterEncodingFilter 並 forceEncoding=true。