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

JSP/Servlet 中文亂碼終極解決方案:從頁面到容器的全鏈路編碼配置

     編輯:Java 綜合教學

亂碼產生根因

中文在 ISO-8859-1(Latin-1)與 UTF-8 間多次轉碼導致資訊損失。典型流程:瀏覽器 UTF-8 編碼 → Tomcat 預設 ISO-8859-1 解碼 → Java 字串內部 UTF-16 → 輸出時再編碼。任何一環不一致即產生亂碼。

五層防線修正策略

第 1 層:JSP 頁面聲明

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

第 2 層:Tomcat 連接器配置 (server.xml)

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

第 3 層:全域字元編碼過濾器 (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>

第 4 層:Servlet 手動設定(非 Spring 專案)

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
    req.setCharacterEncoding("UTF-8");        // 請求體解碼
    resp.setContentType("text/html;charset=UTF-8"); // 回應編碼
    // 業務邏輯...
}

第 5 層:獲取參數時強制轉碼(終極補救)

String raw = request.getParameter("username"); // 已被 ISO-8859-1 錯誤解碼
String fixed = new String(raw.getBytes("ISO-8859-1"), "UTF-8"); // 還原再正確解碼

驗證清單

  1. 瀏覽器 Network 面板確認 Request Headers: Content-Type: application/x-www-form-urlencoded; charset=UTF-8
  2. Tomcat 存取日誌查看原始請求列
  3. 斷點檢查 request.getParameter() 返回值
  4. 資料庫儲存後用工具查看十六進制編碼

最佳實踐建議

  • 全專案統一 UTF-8,拒絕 GBK/Big5
  • Spring Boot 專案僅需 server.servlet.encoding.charset=UTF-8 server.servlet.encoding.force=true
  • 資料庫連線字串加 characterEncoding=utf8&useUnicode=true
  • 前端表單加 accept-charset="UTF-8"
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved