JSP 亂碼問題可歸納為五大類型。本文提供系統性解決方案,涵蓋頁面編碼、請求參數解碼、轉發編碼、資料庫存取編碼四個關鍵環節。
方案:頁面頂部指定編碼指令:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
IDE 級修復 (Eclipse/MyEclipse):Window → Preferences → General → Content Types → Text → JSP,將 Default Encoding 從 ISO-8859-1 改為 UTF-8,點 Update。新建檔案自動帶入正確編碼。
方案:在讀取參數前設定請求編碼:
request.setCharacterEncoding("UTF-8");
建議在 Filter 中統一處理 (如 Spring `CharacterEncodingFilter`),確保所有請求生效。
同 Servlet,在 JSP 頁面讀取參數前插入:
<% request.setCharacterEncoding("UTF-8"); %>
原因:Forward 共享同一 Request 物件,若源頁面未設定編碼,目標頁面讀取參數時用錯編碼。
方案:在 源頁面 (發起 forward 者) 設定 `request.setCharacterEncoding("UTF-8")`,目標頁面自動繼承正確編碼。
方案:JDBC 連線字串明確指定編碼:
// MySQL
jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=UTF-8
// Oracle
jdbc:oracle:thin:@host:1521:sid (需確保 DB、Client、JVM 字符集一致,建議 AL32UTF8)
// SQL Server
jdbc:sqlserver://host:1433;databaseName=db;sendStringParametersAsUnicode=true
同時確保資料表/欄位字符集為 UTF-8 (MySQL: `utf8mb4`)。
亂碼本質是編碼/解碼不匹配。建立全鏈路 UTF-8 標準,配合 Filter 集中管理請求編碼,可徹底消除五大類亂碼。