現象
為解決中文亂碼,傳參前調用兩次 encodeURIComponent。
原因
- IE 默認編碼為系統代碼頁(如 GBK),發送 AJAX 時自動按 GBK 編碼 URL 參數。
- Firefox/Chrome 默認 UTF-8。
- 服務端(如 Java Tomcat)默認按 ISO-8859-1 或 UTF-8 解碼 GET 參數。
雙重編碼是歷史妥協方案:第一次編碼確保字符為 %XX 形式,第二次將 % 編碼為 %25,使經過不同編碼層傳輸後仍能還原。但極不穩定。
現代標準做法
- 統一 UTF-8 全鏈路:
- 頁面
<meta charset="UTF-8">
- 服務端設置
request.setCharacterEncoding("UTF-8") / Tomcat URIEncoding="UTF-8"
- JS 單次
encodeURIComponent 即可。
- 改用 POST + JSON:請求體明確 UTF-8,避開 URL 編碼地獄。
- jQuery $.param / $.ajax data 對象:內部自動處理編碼。