JSP 頁面之間傳遞中文參數時出現亂碼,是許多初學者常遇到的棘手問題。本文提供簡潔有效的解決方案,核心原則是前端雙重編碼、後端指定 UTF-8 解碼、全專案統一字元集。
// 必須雙重 encodeURIComponent,單次編碼無法處理已編碼的 % 符號
var encodedParam = encodeURIComponent(encodeURIComponent(userAccount));
// 產生類似:%25E5%258D%258E%25E5%25B7%25A5(原「華工」UTF-8 編碼後再編碼)
// 獲取參數並指定 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,確保傳輸安全。
除了代碼層面處理,建議在伺服器層面統一字元集,徹底杜絕亂碼根源:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"
useBodyEncodingForURI="true" />
<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")。
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
...
jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
%25)。request.getParameter() 取得的原始值是否為雙重編碼字串。URLDecoder.decode(str, "UTF-8") 解碼後是否還原為正確中文。遵循「雙重編碼 + 統一 UTF-8」原則,配合伺服器層面配置,即可徹底解決 JSP 中文參數傳遞亂碼問題。