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

JSP pageEncoding 與 contentType 徹底解析:三階段編碼流程、亂碼根因與最佳配置實踐

     編輯:Java 程式設計入門

核心結論:兩個屬性的分工

屬性作用階段控制對象默認值
pageEncoding第 1 階段:JSP → .java 源碼JSP 文件磁盤讀取時的字節解碼ISO-8859-1
contentType (charset)第 3 階段:.class → HTTP 響應響應體發送給瀏覽器時的字節編碼ISO-8859-1

三階段編碼流程圖解


[JSP 文件 (GBK/UTF-8 字節)]
        │
        ▼ ① JSP 編譯器 讀取文件
   ┌─────────────────────────────┐
   │  依據 pageEncoding 解碼字節  │  ← 關鍵!若此處錯誤,中文變亂碼進入源碼
   │  統一轉為 UTF-16 (Java char) │
   └─────────────────────────────┘
        │
        ▼ ② javac 編譯 .java → .class
   ┌─────────────────────────────┐
   │  常量池字符串存為 Modified UTF-8 │
   └─────────────────────────────┘
        │
        ▼ ③ Tomcat 運行時輸出響應
   ┌─────────────────────────────┐
   │  依據 contentType charset 編碼 │  ← 瀏覽器按此解碼顯示
   │  字節流寫入 ServletOutputStream │
   └─────────────────────────────┘
        │
        ▼
[瀏覽器接收字節流 → 按 charset 解碼 → 渲染]

常見亂碼場景與修復

場景 1:JSP 文件保存為 GBK,但未聲明 pageEncoding

<%@ page contentType="text/html;charset=UTF-8" %>
<!-- 缺少 pageEncoding -->
你好

現象:編譯器按默認 ISO-8859-1 讀取 GBK 字節,中文變亂碼進入 .java,最終輸出亂碼。
修復:補全 pageEncoding="GBK"(或將文件另存為 UTF-8 並聲明 pageEncoding="UTF-8")。

場景 2:pageEncoding 與 contentType charset 不一致

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

現象:JSP 正確讀取,但輸出強制 UTF-8,瀏覽器正常顯示。這是合法且常見的配置(源文件 GBK,輸出 UTF-8)。

場景 3:只設置 contentType,文件實為 UTF-8

<%@ page contentType="text/html;charset=UTF-8" %>
<!-- 文件編輯器保存為 UTF-8 -->

現象:Tomcat 7+ 默認若無 pageEncoding 則沿用 contentType charset 作為 pageEncoding,通常正常。但為消除歧義,強烈建議顯式聲明 pageEncoding。

最佳實踐模板

<%@ page 
    pageEncoding="UTF-8" 
    contentType="text/html;charset=UTF-8" 
    language="java" 
    import="java.util.*,com.example.model.*" 
%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <title>頁面標題</title>
</head>
<body>
    中文內容正常顯示
</body>
</html>

容器級統一配置(避免每個 JSP 重複聲明)

Tomcat conf/web.xml 全局默認

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <page-encoding>UTF-8</page-encoding>
        <default-content-type>text/html;charset=UTF-8</default-content-type>
    </jsp-property-group>
</jsp-config>

Spring Boot / Spring MVC 統一響應編碼

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List> converters) {
        // JSON 預設 UTF-8,無需額外配置
    }
}

// application.yml
server:
  servlet:
    encoding:
      charset: UTF-8
      force: true
      enabled: true

進階:Tomcat URI 編碼(影響 GET 參數接收)

JSP 編碼只管響應輸出與文件讀取。GET 請求參數在 URL 中,屬於 URI 解碼階段,由 Tomcat server.xml 的 URIEncoding 控制:

<Connector port="8080" protocol="HTTP/1.1"
           URIEncoding="UTF-8" 
           ... />
  • POST 參數在 Body,受 request.setCharacterEncoding() 或 Filter 控制。
  • GET 參數在 URL,只受 URIEncoding 控制,Filter 無效。

總結檢查清單

  1. ✅ JSP 文件物理編碼 = pageEncoding 值(推薦全項目 UTF-8)
  2. ✅ contentType="text/html;charset=UTF-8" 明確聲明
  3. ✅ web.xml 或 server.xml 統一配置,避免漏寫
  4. ✅ Tomcat URIEncoding="UTF-8" 解決 GET 參數亂碼
  5. ✅ 數據庫連接串 characterEncoding=utf8、表字符集 utf8mb4
  6. ✅ 前端頁面 <meta charset="UTF-8">

貫徹「全鏈路 UTF-8」原則,從編輯器保存、JSP 編譯、Java 字符串、Tomcat 輸出、瀏覽器解碼、數據庫存儲,端到端統一字符集,徹底告別亂碼。

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