中文資料寫入 MySQL 正常,Command Client 顯示正常,但 JSP 頁面讀取顯示「火星文」(亂碼)。
my.ini:default-character-set=utf8<%@ page contentType="text/html;charset=gb2312" %>?useUnicode=true&characterEncoding=GB2312以上嘗試皆無效,或僅將亂碼從一種變為另一種。
冷靜思考:JSP 從 MySQL 讀取時實際使用何種編碼?經查證與測試,MySQL JDBC 驅動預設以 ISO-8859-1 (Latin1) 讀取位元組,若資料庫實際存儲為 GB2312,直接顯示必然錯位。
<%= new String(sqlRst.getString(1).getBytes("ISO-8859-1"), "GB2312") %>
邏輯: 先取得驅動以 ISO-8859-1 解讀的字串 → getBytes("ISO-8859-1") 還原原始位元組 → new String(bytes, "GB2312") 按真實編碼重組字串。
CHARSET=gb2312(或 utf8),my.ini 設 default-character-set=gb2312。useUnicode=true&characterEncoding=GB2312。pageEncoding="GB2312",若仍異常再用上述雙重轉碼法修正。亂碼本質是編碼解碼不匹配。找出驅動預設讀取編碼(ISO-8859-1),針對性轉碼即可破解。長遠看,全棧統一 UTF-8 是根治之道。