URL 參數傳遞中文、日文等非 ASCII 字符時,編碼不一致是亂碼的根因。本文給出前後端統一編碼的標準化方案,覆蓋 JavaScript、Java Servlet/JSP、表單回顯三大場景。
<meta charset="UTF-8"> / <%@ page contentType="text/html;charset=UTF-8" %>encodeURIComponent()(推薦)而非 encodeURI(),後者不編碼 ? & = + # 等保留字符。URLDecoder.decode(value, "UTF-8")。URLEncoder.encode(value, "UTF-8")(注意空格會變 +,非 %20)。// 錯誤:encodeURI 不編碼 & = 等,導致參數截斷
var url = "/api?kw=" + encodeURI("張三&李四");
// 正確:encodeURIComponent 編碼所有保留字
var url = "/api?kw=" + encodeURIComponent("張三&李四");
// 結果:/api?kw=%E5%BC%A0%E4%B8%89%26%E6%9D%8E%E5%9B%9B
// 容器默認 ISO-8859-1 解碼導致亂碼
String raw = request.getParameter("kw");
// 方案 1:Tomcat 8+ 設置 URIEncoding="UTF-8" (server.xml Connector),無需代碼修改
// 方案 2:手動轉碼(不推薦,易漏)
String fixed = new String(raw.getBytes("ISO-8859-1"), "UTF-8");
<input name="companyName" value='<%=
// 正確:容器已正確解碼,直接輸出
request.getAttribute("companyName")
%>' />
// 若容器解碼錯誤(舊版 Tomcat 無 URIEncoding),在 Filter 中統一設置:
request.setCharacterEncoding("UTF-8"); // 僅對 POST Body 有效
// GET 參數需依賴 Connector URIEncoding
| 編碼 | 全稱 | 適用範圍 |
|---|---|---|
| ASCII | American Standard Code for Information Interchange | 基本拉丁字母、控制字符(0-127) |
| GB2312 | 漢字編碼標準 | 6763 漢字,簡體為主 |
| GBK | 擴展 GB2312 | 含繁體、生僻字,兼容 GB2312 |
| SJIS / MS932 | Shift_JIS / Microsoft 擴展 | 日文環境 |
| Unicode | 統一碼 | 碼點空間,非具體存儲格式 |
| UTF-8 | Unicode Transformation Format-8 | 變長 1-4 字節,ASCII 兼容,Web 標準 |
頁面、JS、Java、資料庫、HTTP Header 全鏈路鎖定 UTF-8,Tomcat 開啟 URIEncoding,前端用 encodeURIComponent,後端用 URLDecoder.decode(..., "UTF-8"),亂碼即刻消失。