首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> JSP 程式設計 >> 關於JSP

JSP + MySQL 中文亂碼終極解決:POST 提交亂碼全鏈路 UTF-8 實戰

     編輯:關於JSP

JSP 表單 POST 提交中文數據,經 MySQL 存取後頁面顯示亂碼,數據庫中亦為亂碼。本文記錄從現象排查到根因定位、分層修正、最終驗證的完整實戰過程,提煉出全鏈路 UTF-8 統一配置最佳實踐。

現象復現

  • index.jsp (GB2312) → 提交中文「張三」 → mysql_insert.jsp (UTF-8) 顯示亂碼
  • 數據庫 person_tb.name 欄位存儲為亂碼
  • 直接在數據庫插入中文 → mysql_insert.jsp 顯示正常 → 問題在寫入/傳輸環節

排查與修正歷程

第一層:JSP 頁面編碼聲明

統一所有 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 前調用

第三層:Tomcat 容器配置

server.xml Connector 添加:

<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8" />
  • 解決 GET 請求 URL 參數解碼
  • 若需多編碼共存,改用 useBodyEncodingForURI="true"

第四層:資料庫連接與存儲層

String connUrl = "jdbc:mysql://localhost/html_db?user=root&password=123456&useUnicode=true&characterEncoding=UTF-8";
...
stmt.executeQuery("SET NAMES UTF8");
  • JDBC URL 顯式指定 characterEncoding=UTF-8
  • SET NAMES UTF8 確保會話層面字符集一致
  • 資料庫/表/欄位編碼均為 utf8mb4

第五層:開發工具陷阱

Dreamweaver 修改 JSP 可能破壞文件編碼,導致中文變亂碼。強制使用支援 UTF-8 無 BOM 保存的編輯器(MyEclipse/IntelliJ IDEA/VS Code)。

最終驗證代碼

index.jsp

<%@ 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>

mysql_insert.jsp

<%@ 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");
  // 顯示結果...
%>

全鏈路 UTF-8 檢查清單(收藏級)

  1. JSP:pageEncoding="UTF-8" + contentType="text/html;charset=UTF-8"
  2. Java 源文件:編輯器保存為 UTF-8 無 BOM,javac -encoding UTF-8
  3. Tomcat:URIEncoding="UTF-8" (+ 過濾器 request.setCharacterEncoding("UTF-8"))
  4. MySQL:庫/表/欄位 utf8mb4,JDBC URL characterEncoding=UTF-8,會話 SET NAMES UTF8MB4
  5. 瀏覽器:<meta charset="UTF-8">(HTML5 簡寫)
  6. 工具鏈:編輯器、構建工具、部署腳本全鏈路 UTF-8

核心原理回顧

亂碼本質:編碼 ≠ 解碼。JSP 處理經歷三階段:
1. JSP→Java:按 pageEncoding 讀取 → 統一為 UTF-8 字節碼
2. Java 編譯:UTF-8 源碼 → UTF-8 Class 字節碼
3. 執行輸出:按 contentType charset 編碼輸出 → 瀏覽器按同 charset 解碼
全鏈路統一 UTF-8,消除所有轉換環節,是徹底根治的唯一正道。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved