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

JSP 頁面傳參亂碼徹底解決方案:雙重編碼與統一字元集

     編輯:關於JSP

JSP 頁面之間傳遞中文參數時出現亂碼,是許多初學者常遇到的棘手問題。本文提供簡潔有效的解決方案,核心原則是前端雙重編碼、後端指定 UTF-8 解碼、全專案統一字元集。

最小化修正代碼

前端(JavaScript/JSP 頁面)

// 必須雙重 encodeURIComponent,單次編碼無法處理已編碼的 % 符號
var encodedParam = encodeURIComponent(encodeURIComponent(userAccount));
// 產生類似:%25E5%258D%258E%25E5%25B7%25A5(原「華工」UTF-8 編碼後再編碼)

後端(Java Servlet/JSP)

// 獲取參數並指定 UTF-8 解碼
String userAccount = request.getParameter("userAccount");
if (userAccount != null) {
    try {
        userAccount = java.net.URLDecoder.decode(userAccount, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace(); // 理論上不會發生,JDK 必備 UTF-8
    }
}

為什麼需要雙重編碼?

當參數值本身包含特殊字元(如 %、+、&、=)時,單次 encodeURIComponent 產生的 % 會在 URL 傳輸或伺服器解析時被誤認為編碼標記。雙重編碼將第一次產生的 % 轉為 %25,確保傳輸安全。

系統級配置:一勞永逸

除了代碼層面處理,建議在伺服器層面統一字元集,徹底杜絕亂碼根源:

1. Tomcat server.xml 設定 URI 編碼

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           URIEncoding="UTF-8"
           useBodyEncodingForURI="true" />

2. Web 專案 web.xml 過濾器統一編碼

<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

若不使用 Spring,可自寫簡單 Filter 於 doFilter 執行 request.setCharacterEncoding("UTF-8") 與 response.setCharacterEncoding("UTF-8")。

3. 所有 JSP 頁面聲明 UTF-8

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    ...

4. 資料庫連線指定字元集

jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC

快速排查清單

  1. 瀏覽器發送請求時,Network 面板查看 Query String Parameters 是否為雙重編碼格式(含 %25)。
  2. 伺服器收到請求後,request.getParameter() 取得的原始值是否為雙重編碼字串。
  3. URLDecoder.decode(str, "UTF-8") 解碼後是否還原為正確中文。
  4. 資料庫儲存/讀取時字元集是否一致。

遵循「雙重編碼 + 統一 UTF-8」原則,配合伺服器層面配置,即可徹底解決 JSP 中文參數傳遞亂碼問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved