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

JSP request 內置對象深度解析(二):亂碼根因分析與徹底解決方案

     編輯:關於JSP

亂碼是 Web 開發「頭號難題」,本文從原理層面剖析亂碼產生機制,提供請求參數、響應輸出、文件讀寫全鏈路編碼統一策略。

亂碼本質:編碼與解碼不匹配

  • 編碼:字符 → 字節(發送端:瀏覽器、文件寫入)。
  • 解碼:字節 → 字符(接收端:服務器、文件讀取)。
  • 亂碼發生當且僅當:解碼字符集 ≠ 編碼字符集。

請求參數亂碼場景復現

<!-- Request_01.jsp: pageEncoding=gbk -->
<form action="request_02.jsp" method="post">
  請輸入信息:<input type="text" name="info">
  <input type="submit" value="提交">
</form>

<!-- Request_02.jsp: pageEncoding=gbk -->
<% String content = request.getParameter("info"); %>
<h2><%=content%></h2>

現象:瀏覽器按 UTF-8 編碼發送,Tomcat 默認按 ISO-8859-1 解碼 → 亂碼。

分層解決方案

1. POST 請求:request.setCharacterEncoding()

<% request.setCharacterEncoding("UTF-8"); %> <-- 必須在 getParameter() 前調用 -->
String content = request.getParameter("info");

原理:覆蓋容器默認解碼字符集。注意:對 GET 請求無效(Tomcat 5.5+ 需配置 URIEncoding)。

2. GET 請求:Tomcat 配置 URIEncoding

修改 server.xml 中 Connector 節點:

<Connector port="8080" URIEncoding="UTF-8" />

強制容器按 UTF-8 解碼 URL 參數。

3. 響應輸出編碼:response.setContentType()

response.setContentType("text/html;charset=UTF-8");

或頁面指令:<%@ page contentType="text/html;charset=UTF-8" %>

4. 全鏈路統一:CharacterEncodingFilter(推薦)

public class EncodingFilter implements Filter {
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        chain.doFilter(req, resp);
    }
}

在 web.xml 映射 /*,一次配置全局生效。

總結:編碼統一鐵律

  1. 頁面編碼:UTF-8(JSP 指令、HTML meta)
  2. 請求解碼:UTF-8(Filter/URIEncoding)
  3. 響應編碼:UTF-8(Content-Type)
  4. 數據庫連接:UTF-8(JDBC URL 參數)
  5. Java 源文件:UTF-8(IDE 設置)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved