JSP 表單 POST 提交中文數據,經 MySQL 存取後頁面顯示亂碼,數據庫中亦為亂碼。本文記錄從現象排查到根因定位、分層修正、最終驗證的完整實戰過程,提煉出全鏈路 UTF-8 統一配置最佳實踐。
統一所有 JSP 頁面頂部雙重聲明:
<%@ page language="java" pageEncoding="UTF-8" %> <%@ page contentType="text/html;charset=UTF-8" %>
pageEncoding:源文件保存編碼,影響 JSP 編譯階段讀取contentType charset:響應頭 Content-Type,影響瀏覽器解碼在每頁(或過濾器)最早處添加:
<%
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
%>
request.setCharacterEncoding:覆蓋 Tomcat 預設 ISO-8859-1,解決 POST 參數解碼getParameter 前調用server.xml Connector 添加:
<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8" />
useBodyEncodingForURI="true"String connUrl = "jdbc:mysql://localhost/html_db?user=root&password=123456&useUnicode=true&characterEncoding=UTF-8";
...
stmt.executeQuery("SET NAMES UTF8");
characterEncoding=UTF-8SET NAMES UTF8 確保會話層面字符集一致utf8mb4Dreamweaver 修改 JSP 可能破壞文件編碼,導致中文變亂碼。強制使用支援 UTF-8 無 BOM 保存的編輯器(MyEclipse/IntelliJ IDEA/VS Code)。
<%@ page language="java" pageEncoding="UTF-8" %>
<%@ page contentType="text/html;charset=UTF-8" %>
<%
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
%>
<form action="mysql_insert.jsp" method="post">
姓名: <input name="name" />
<input type="submit" value="提交">
</form>
<%@ page language="java" pageEncoding="UTF-8" %>
<%@ page contentType="text/html;charset=UTF-8" %>
<%
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
%>
<%
String name = request.getParameter("name");
// JDBC 插入與查詢,連接 URL 含 useUnicode=true&characterEncoding=UTF-8
// stmt.executeQuery("SET NAMES UTF8");
// 顯示結果...
%>
pageEncoding="UTF-8" + contentType="text/html;charset=UTF-8"javac -encoding UTF-8URIEncoding="UTF-8" (+ 過濾器 request.setCharacterEncoding("UTF-8"))utf8mb4,JDBC URL characterEncoding=UTF-8,會話 SET NAMES UTF8MB4<meta charset="UTF-8">(HTML5 簡寫)亂碼本質:編碼 ≠ 解碼。JSP 處理經歷三階段:
1. JSP→Java:按 pageEncoding 讀取 → 統一為 UTF-8 字節碼
2. Java 編譯:UTF-8 源碼 → UTF-8 Class 字節碼
3. 執行輸出:按 contentType charset 編碼輸出 → 瀏覽器按同 charset 解碼
全鏈路統一 UTF-8,消除所有轉換環節,是徹底根治的唯一正道。