<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8" />
<Connector port="8009" protocol="AJP/1.3"
redirectPort="8443"
URIEncoding="UTF-8" />
原理: Tomcat 預設用 ISO-8859-1 解碼 URL,加上 URIEncoding="UTF-8" 強制指定解碼字集。
適用於任何部署環境(含反向代理、負載均衡)。
// 推薦:雙重 encodeURIComponent
title = escape(encodeURIComponent(title));
// 或
title = encodeURI(encodeURI("包含中文的串"));
url = contextPath + "/print/printList!printTable.action?title=" + title;
String title = java.net.URLDecoder.decode(request.getParameter("title"), "UTF-8");
核心原則: 前端編碼幾次,後端就要解碼幾次,且字集必須一致(UTF-8)。
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
若仍亂碼,可嘗試手動轉碼:
// 從 ISO-8859-1 轉回目標編碼
String str = new String(str.getBytes("ISO-8859-1"), "UTF-8");
// 輸出前轉為 ISO-8859-1(網路傳輸標準)
String outStr = new String(str.getBytes("UTF-8"), "ISO-8859-1");
| 階段 | 預設編碼 | 建議設定 |
|---|---|---|
| URL 解碼 | ISO-8859-1 | URIEncoding="UTF-8" |
| Request 參數 | ISO-8859-1 | 前端雙重編碼 + 後端 UTF-8 解碼 |
| JSP 輸出 | ISO-8859-1 | pageEncoding="UTF-8" |
| Java 內部 | UTF-16 | 統一使用 UTF-8 儲存/傳輸 |
server.xml 兩個 Connector 皆加 URIEncoding="UTF-8"encodeURIComponentURLDecoder.decode(param, "UTF-8")charset=UTF-8characterEncoding=utf8