從 Tomcat 5.x 開始,GET 和 POST 請求的編碼處理機制不同,是導致中文亂碼的核心原因。本文系統梳理亂碼產生機制,提供從配置到代碼的多層次解決方案。
request.setCharacterEncoding("UTF-8"),始終使用 ISO-8859-1 解碼 URI。request.setCharacterEncoding("UTF-8") 設置,未設置時默認使用 ISO-8859-1。<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1"
redirectPort="8443" URIEncoding="UTF-8" />
在 <Connector> 元素添加 URIEncoding="UTF-8",強制 Tomcat 以 UTF-8 解碼 URL 參數。
String name = request.getParameter("parameter");
byte[] arr = name.getBytes("ISO-8859-1");
String nameAfterTransfer = new String(arr, "UTF-8");
先按 ISO-8859-1 取得字節數組,再按 UTF-8 重構字符串。適用於無法修改服務器配置的場景。
在 web.xml 配置全局過濾器,攔截所有請求統一設置編碼:
<filter>
<filter-name>SetCharacterEncodingFilter</filter-name>
<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>ignore</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SetCharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
ignore=true 表示強制覆蓋瀏覽器指定的編碼,確保統一使用 UTF-8。
在 server.xml 的 <Connector> 中同時啟用:
<Connector ... URIEncoding="UTF-8" useBodyEncodingForURI="true" />
useBodyEncodingForURI="true" 使 Tomcat 使用請求體編碼(由 POST 設置的編碼)來解碼 URI,實現 GET/POST 統一 UTF-8 解碼。
測試場景:HTML 頁面 <meta charset="UTF-8">,POST 提交中文 "大" 到 Servlet。
結果:亂碼。
原因:Tomcat 不讀取頁面編碼聲明,請求頭無編碼信息時默認 ISO-8859-1。
結論:必須在服務端顯式設置編碼(request.setCharacterEncoding("UTF-8") 或過濾器),不可依賴前端聲明。
useBodyEncodingForURI="true" + URIEncoding="UTF-8"request.setCharacterEncoding("UTF-8")(或配置 SetCharacterEncodingFilter)雙重保障下,GET 與 POST 請求均能正確 UTF-8 解碼,徹底消除中文亂碼。