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

MyEclipse/JSP 插入中文變問號?統一字符集徹底解決亂碼

     編輯:程式設計疑難解答

問題現象

JSP 頁面表單提交中文 → Servlet/DAO 入庫 → 數據庫查看變 ????,但直接在數據庫客戶端插入中文正常。

根本原因:字符集不一致

數據流向:瀏覽器 → Tomcat → JDBC → MySQL,每一環節的編碼必須一致。任一環節不匹配即產生亂碼。

三大關鍵統一點

  1. 頁面編碼:JSP 頁首聲明 <%@ page contentType="text/html;charset=UTF-8" %>,HTML meta 標簽 <meta charset="UTF-8">。
  2. Tomcat URI 編碼:server.xml 的 <Connector port="8080" URIEncoding="UTF-8" />(GET 參數需此項,POST 需配合 Filter)。
  3. JDBC 連接串:jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC。

數據庫端檢查

SHOW VARIABLES LIKE 'character_set_%';
-- 確保 character_set_database, character_set_server, character_set_connection 均為 utf8 或 utf8mb4

建表時顯式指定:CREATE TABLE t (...) DEFAULT CHARSET=utf8mb4;(utf8mb4 支持 Emoji)。

POST 請求專用:字符集過濾器

@WebFilter("/*")
public class EncodingFilter implements Filter {
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        chain.doFilter(req, resp);
    }
}

或在 web.xml 配置 Spring 的 CharacterEncodingFilter。

驗證步驟

  1. 瀏覽器開發者工具 → Network → 查看 Request Payload/Headers 編碼。
  2. Java 代碼打印 new String(param.getBytes("ISO-8859-1"), "UTF-8") 測試(Tomcat 8+ 默認 UTF-8 通常無需此轉換)。
  3. 數據庫客戶端 SELECT HEX(col) FROM t 檢查存儲的十六進制編碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved