萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 網路安全 >  >> 網路基礎知識

URL 編碼亂碼終極解決方案:JavaScript encodeURI/decodeURI 與 Java URLEncoder/URLDecoder 正確姿勢

URL 參數傳遞中文、日文等非 ASCII 字符時,編碼不一致是亂碼的根因。本文給出前後端統一編碼的標準化方案,覆蓋 JavaScript、Java Servlet/JSP、表單回顯三大場景。

核心原則:全鏈路 UTF-8

  • 頁面編碼:<meta charset="UTF-8"> / <%@ page contentType="text/html;charset=UTF-8" %>
  • JS 編碼:encodeURIComponent()(推薦)而非 encodeURI(),後者不編碼 ? & = + # 等保留字符。
  • Java 解碼:URLDecoder.decode(value, "UTF-8")。
  • Java 編碼:URLEncoder.encode(value, "UTF-8")(注意空格會變 +,非 %20)。

場景一:AJAX/JS 構造 URL 參數

// 錯誤: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

場景二:Java Servlet 獲取參數

// 容器默認 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");

場景三:JSP 表單回顯中文值

<input name="companyName" value='<%= 
    // 正確:容器已正確解碼,直接輸出
    request.getAttribute("companyName") 
%>' />

// 若容器解碼錯誤(舊版 Tomcat 無 URIEncoding),在 Filter 中統一設置:
request.setCharacterEncoding("UTF-8"); // 僅對 POST Body 有效
// GET 參數需依賴 Connector URIEncoding

編碼體系速查

編碼全稱適用範圍
ASCIIAmerican Standard Code for Information Interchange基本拉丁字母、控制字符(0-127)
GB2312漢字編碼標準6763 漢字,簡體為主
GBK擴展 GB2312含繁體、生僻字,兼容 GB2312
SJIS / MS932Shift_JIS / Microsoft 擴展日文環境
Unicode統一碼碼點空間,非具體存儲格式
UTF-8Unicode Transformation Format-8變長 1-4 字節,ASCII 兼容,Web 標準

一句話總結

頁面、JS、Java、資料庫、HTTP Header 全鏈路鎖定 UTF-8,Tomcat 開啟 URIEncoding,前端用 encodeURIComponent,後端用 URLDecoder.decode(..., "UTF-8"),亂碼即刻消失。

copyright © 萬盛學電腦網 all rights reserved