瀏覽器以頁面編碼 (如 GBK/UTF-8) 送出表單,伺服器若以不同編碼 (預設 ISO-8859-1) 解碼,位元組序列被錯誤解讀,產生「??」或亂碼。解決核心:**全鏈路編碼統一**。
<!-- Demo01.html: 頁面未指定 charset,瀏覽器預設可能為 GBK -->
<form action="demo02.jsp" method="post">
用戶名:<input type="text" name="uname">
<input type="submit" value="go">
</form>
<%-- demo02.jsp: 僅指定輸出編碼,未處理請求編碼 --%>
<%@ page contentType="text/html;charset=gbk" %>
<h1>輸入內容為:<%= request.getParameter("uname") %></h1>
結果:輸入中文顯示「??」。
<%@ page contentType="text/html;charset=gbk" %>
<%
// 1. 取得錯誤解碼後的字串 (實際為 ISO-8859-1 解碼)
// 2. 還原為原始位元組陣列
// 3. 用正確編碼 (GBK) 重新解碼
String name = new String(request.getParameter("uname").getBytes("ISO-8859-1"), "GBK");
%>
<h1>輸入內容為:<%= name %></h1>
原理:request.getParameter() 內部預設用 ISO-8859-1 解碼位元組流。先 .getBytes("ISO-8859-1") 取回原始位元組,再 new String(bytes, "GBK") 正確解碼。
<meta charset="UTF-8"> 或 <%@ page pageEncoding="UTF-8" %>web.xml 配置 CharacterEncodingFilter (Spring) 或 Tomcat URIEncoding="UTF-8"。
3. 資料庫連線 URL 加 characterEncoding=utf8、useUnicode=true。
4. Java 代碼中字串處理統一 UTF-8,避免中間轉碼。