首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java URLDecoder 解碼亂碼問題排查:編碼格式不一致與前端配合

     編輯:程式設計疑難解答

問題現象

後台收到 URL 編碼字符串 %D7%AE%EF%BF%BD%EF%BF%BD%2F015.JPG,使用 URLDecoder.decode(str, "UTF-8") 解碼出現亂碼。

根因:編碼格式不匹配

%D7%AE 是 **GBK/GB2312** 編碼的中文「圖」字雙字節。%EF%BF%BD 是 UTF-8 中「替換字符」 () 的編碼,說明字節流在某個環節被錯誤轉碼。

前端編碼函數對比

函數編碼方式不編碼字符適用場景
escape()ISO Latin-1 (單字節)@ * / +舊項目、非 UTF-8 頁面
encodeURI()UTF-8! @ # $ & * ( ) = : / ; ? + ' ~整個 URL,保留結構字符
encodeURIComponent()UTF-8! ' ( ) * ~推薦:單個參數值,編碼最全

正確前後端協作方案

方案一:統一 UTF-8 (現代標準,強烈推薦)

// 前端 JS
var param = "中文文件名.jpg";
var url = "upload.action?file=" + encodeURIComponent(param); // UTF-8 編碼
// 發送請求...

// 後端 Java (Spring MVC 自動處理,或手動)
String file = request.getParameter("file");
// Spring MVC 已自動按 UTF-8 解碼,直接用 file 即可
// 若手動:
// String decoded = java.net.URLDecoder.decode(file, StandardCharsets.UTF_8.name());

關鍵配置:

  • 頁面 ``
  • Spring MVC `org.springframework.web.filter.CharacterEncodingFilterencodingUTF-8forceEncodingtrue`
  • Tomcat `` (GET 參數)

方案二:legacy GBK 頁面不想改編碼

// 前端:頁面 charset=GB2312
var url = "upload.action?file=" + escape(param); // escape 產生 %D7%AE...

// 後端:指定 GBK 解碼
String decoded = java.net.URLDecoder.decode(file, "GBK");

Java 代碼最佳實踐

import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;

public class UrlDecodeUtil {
    public static String decodeUtf8(String encoded) {
        try {
            return URLDecoder.decode(encoded, StandardCharsets.UTF_8.name());
        } catch (Exception e) {
            // 嘗試 GBK 兼容舊數據
            try { return URLDecoder.decode(encoded, "GBK"); } 
            catch (Exception ex) { return encoded; } // 解碼失敗返回原串
        }
    }
}

排查清單

  1. 確認前端用 encodeURIComponent (UTF-8) 而非 escape。
  2. 確認頁面、Tomcat、Spring Filter 全鏈路 UTF-8。
  3. 日誌打印收到的原始參數 request.getParameter("file"),觀察 %XX 模式判斷編碼。
  4. 若見 %EF%BF%BD (替換字符),說明字節流已損壞,**無法完美恢復**,需從源頭修正編碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved