JSP 頁面指令中有兩個與編碼相關的屬性:`pageEncoding` 與 `contentType`。許多開發者對兩者關係存在誤解,甚至以為必須保持一致才能避免亂碼。本文透過實測圖示與原理分析,揭示兩者各自獨立的職責,並解釋為何設定不同編碼也能正常顯示中文。
實測環境:Tomcat 8.5,JSP 頁面分別設定不同編碼組合。

測試結果:將 `pageEncoding="UTF-8"`、`contentType="text/html; charset=GBK"`(或相反),中文顯示完全正常,無亂碼。

| 屬性 | 作用階段 | 核心職責 | 影響對象 |
|---|---|---|---|
| pageEncoding | JSP → Servlet 轉譯階段 | 規定 JSP 檔案以何種編碼儲存,以及容器以何種編碼讀取源碼。確保「原始碼位元組 → 字元」轉換正確。 | JSP 來源檔案、轉譯後的 Java 檔案中的字串常量 |
| contentType | Servlet 輸出回應階段 | 設定 HTTP 回應 Header `Content-Type` 的 `charset`,告訴瀏覽器以何種編碼解碼回應體。同時指導 `out.write()` 以該編碼將字元轉為位元組輸出。 | HTTP 回應流、瀏覽器渲染 |
[JSP 檔案 (bytes)]
│ pageEncoding=UTF-8 (讀取解碼)
▼
[JSP 引擎內部字元序列]
│ 轉譯生成 Servlet Java 程式碼
▼
[Servlet 編譯為 Class]
│ 執行 service(),out.print("中文")
▼
[字元序列]
│ contentType=GBK (輸出編碼)
▼
[HTTP 回應體]
│ Content-Type: text/html; charset=GBK
▼
[瀏覽器以 GBK 解碼顯示] → 正常
<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<page-encoding>UTF-8</page-encoding>
</jsp-property-group>
</jsp-config>
| 誤區 | 事實 |
|---|---|
| 兩者必須一致 | 不必一致,各自獨立生效 |
| 設定 contentType 就能解決 JSP 檔案讀取亂碼 | contentType 不影響 JSP 檔案讀取,需設 pageEncoding |
| pageEncoding 會影響 HTTP 回應編碼 | 不影響,除非未設 contentType 時容器以 pageEncoding 為預設輸出編碼 |
理解 `pageEncoding`(源碼讀取)與 `contentType`(回應輸出)的分工邊界,是徹底解決 JSP 中文亂碼的關鍵。實務上統一採用 UTF-8 並配置全域預設,能從根源消除編碼困擾,讓團隊專注於業務開發。