| 屬性 | 作用階段 | 控制對象 | 默認值 |
|---|---|---|---|
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 解碼 → 渲染]
<%@ page contentType="text/html;charset=UTF-8" %>
<!-- 缺少 pageEncoding -->
你好
現象:編譯器按默認 ISO-8859-1 讀取 GBK 字節,中文變亂碼進入 .java,最終輸出亂碼。
修復:補全 pageEncoding="GBK"(或將文件另存為 UTF-8 並聲明 pageEncoding="UTF-8")。
<%@ page pageEncoding="GBK" contentType="text/html;charset=UTF-8" %>
現象:JSP 正確讀取,但輸出強制 UTF-8,瀏覽器正常顯示。這是合法且常見的配置(源文件 GBK,輸出 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>
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>
@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
JSP 編碼只管響應輸出與文件讀取。GET 請求參數在 URL 中,屬於 URI 解碼階段,由 Tomcat server.xml 的 URIEncoding 控制:
<Connector port="8080" protocol="HTTP/1.1"
URIEncoding="UTF-8"
... />
request.setCharacterEncoding() 或 Filter 控制。pageEncoding 值(推薦全項目 UTF-8)contentType="text/html;charset=UTF-8" 明確聲明web.xml 或 server.xml 統一配置,避免漏寫URIEncoding="UTF-8" 解決 GET 參數亂碼characterEncoding=utf8、表字符集 utf8mb4<meta charset="UTF-8">貫徹「全鏈路 UTF-8」原則,從編輯器保存、JSP 編譯、Java 字符串、Tomcat 輸出、瀏覽器解碼、數據庫存儲,端到端統一字符集,徹底告別亂碼。