JSP 中文亂碼本質是「瀏覽器解碼編碼 ≠ 服務器編碼編碼」。涉及環節:JSP 文件保存編碼、頁面指令 contentType、Meta 標籤、請求參數解碼、數據庫連接編碼。任一環節不匹配即現亂碼。
問題代碼:
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"></head>
<body><% out.print("JSP的中文處理"); %></body>
</html>
解決方案:在頁面第一行添加 page 指令,強制響應頭編碼:
<%@ page contentType="text/html; charset=gb2312" %>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"></head>
<body><% out.print("JSP的中文處理"); %></body>
</html>
原理:pageEncoding(或 contentType 含 charset)決定響應頭 Content-Type: text/html; charset=gb2312,瀏覽器據此解碼。Meta 標籤優先級較低,僅作備用。
提交頁(submit.jsp)編碼正確,但處理頁(process.jsp)未指定請求編碼,導致 request.getParameter() 解碼錯誤。
修正:在 process.jsp 頭部添加:
<% request.setCharacterEncoding("gb2312"); %>
必須在讀取任何參數之前調用,否則無效。
| 層級 | 配置點 | 推薦值 |
|---|---|---|
| JSP 文件 | IDE 保存編碼 | UTF-8 / GBK |
| 頁面指令 | <%@ page pageEncoding="..." %> | 與文件編碼一致 |
| 響應頭 | contentType="text/html; charset=..." | 與頁面編碼一致 |
| 請求解碼 | request.setCharacterEncoding(...) | 與表單頁編碼一致 |
| Tomcat | server.xml URIEncoding | UTF-8 |
| 數據庫 | JDBC URL characterEncoding | 與數據庫編碼一致 |
現代建議:全鏈路統一使用 UTF-8,避免 GBK/GB2312 在移動端、多語言場景下的兼容性問題。Spring Boot 等框架默認即為 UTF-8。