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

JSP 中文路徑編碼問題解決方案:ISO-8859-1 與 UTF-8 轉換實戰

     編輯:程式設計綜合問答

錯誤現象分析

The requested resource (/MIS/%E4%B8%BB%E9%A2%98%E5%A4%B4%E5%83%8F%E7%BD%91%E9%A1%B5.jsp) is not available.

%E4%B8%BB%E9%A2%98%E5%A4%B4%E5%83%8F%E7%BD%91%E9%A1%B5 是 主題頭像網頁 的 **UTF-8 URL 編碼**形式。錯誤訊息顯示伺服器嘗試尋找該路徑但失敗,核心原因通常是:**Tomcat 預設以 ISO-8859-1 解碼 URL 路徑,導致中文路徑解析錯誤**。

根本原因:Tomcat 預設 URI 編碼行為

  • HTTP 協定規定 URL 僅允許 ASCII 字元,非 ASCII 必須 Percent-Encoding。
  • 瀏覽器送出請求時,將中文路徑編碼為 UTF-8 後再 Percent-Encoding(如 %E4%B8%BB...)。
  • Tomcat 8.5+ 預設 **URIEncoding="UTF-8"**,但舊版或特定配置下可能使用 ISO-8859-1 解碼,導致 %E4%B8%BB 被誤解為三個獨立字元而非一個中文字。

解決方案對比

方案適用場景配置位置優點缺點
Tomcat 全域 URIEncoding全專案、根治server.xml <Connector>一次設定、無代碼入侵、效能最佳需重啟 Tomcat、影響所有 Webapp
Filter 統一編碼無法修改 server.xml、共享主機web.xml 註冊 Filter專案級隔離、可同時處理 POST/GET需確保 Filter 為第一個、略增開銷
手動轉碼臨時修復、特定 ServletJava 代碼中靈活控制易漏、維護困難、不推薦

方案一:Tomcat server.xml 配置(推薦)

<!-- conf/server.xml -->
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           URIEncoding="UTF-8"
           useBodyEncodingForURI="true" />
  • URIEncoding="UTF-8":指定 **GET 請求 URL 路徑/查詢字串** 的解碼字元集。
  • useBodyEncodingForURI="true":若 URIEncoding 未設定,回退使用請求主體編碼(POST 表單通常為 UTF-8)。
  • **Tomcat 8.5+ 兩者預設皆為 UTF-8**,舊版本必須顯式設定。

方案二:CharacterEncodingFilter(Spring 專案常用)

// web.xml
<filter>
    <filter-name>encodingFilter</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>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

關鍵:forceEncoding=true 強制覆蓋請求/回應編碼,**必須註冊為第一個 Filter**。

方案三:手動轉碼(不推薦,僅作理解)

// 獲取原始查詢字串(Tomcat 以 ISO-8859-1 解碼後的錯誤字串)
String wrong = request.getParameter("param");
// 逆向還原:先以 ISO-8859-1 編碼回位元組,再以 UTF-8 解碼
String correct = new String(wrong.getBytes("ISO-8859-1"), "UTF-8");

此法依賴 Tomcat 確實用 ISO-8859-1 解碼,若已設定 UTF-8 反而會雙重編碼導致亂碼。

前端配合:JSP 頁面編碼聲明

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
  • pageEncoding:JSP 檔案本身儲存編碼(IDE 儲存時)。
  • contentType:回應 HTTP Header Content-Type: text/html;charset=UTF-8。
  • <meta charset>:瀏覽器解碼 HTML 內容依據。

完整編碼鏈路檢查清單

  1. 資料庫:表/欄位 CHARSET=utf8mb4,連線字串 characterEncoding=utf8。
  2. 後端:Java 檔案 UTF-8 儲存,字串常量無編碼問題(JDK 18+ 預設 UTF-8)。
  3. 伺服器:Tomcat URIEncoding="UTF-8"。
  4. Filter:CharacterEncodingFilter 設定 forceEncoding=true。
  5. JSP:pageEncoding="UTF-8"、contentType="...UTF-8"、<meta charset="UTF-8">。
  6. 前端:AJAX contentType: 'application/json;charset=UTF-8',Form accept-charset="UTF-8"。
  7. 瀏覽器:開發者工具 Network 標籤檢查 Request/Response Headers 與 Payload 實際編碼。

除錯技巧

// 在 Filter 或 Servlet 早期印出實際編碼
System.out.println("request.getCharacterEncoding() = " + request.getCharacterEncoding());
System.out.println("request.getParameter('name') = " + request.getParameter("name"));
// 觀察控制台輸出是否為預期中文

總結

JSP 中文路徑 404 核心在於 **Tomcat URL 解碼字元集不匹配**。**首選方案:修改 server.xml 設定 URIEncoding="UTF-8"**,一勞永逸。若無法修改伺服器配置,部署 CharacterEncodingFilter 並確保順序最前。建立完整 UTF-8 編碼鏈路(DB → Java → Tomcat → JSP → 瀏覽器)才能徹底杜絕亂碼問題。

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