Cookie 規範(RFC 2109)限制值僅能包含 ASCII 字符,直接存中文會導致錯誤。解決方案:寫入前 URLEncoder.encode,讀取時 URLDecoder.decode。
<%@ page pageEncoding="UTF-8" %>
<%
String name = request.getParameter("name"); // 取得中文參數
// 關鍵:雙重編碼處理,避免瀏覽器/容器編碼差異導致亂碼
byte[] raw = name.getBytes("ISO-8859-1");
String decoded = new String(raw, "GB2312"); // 還原真實中文
Cookie c = new Cookie("username", URLEncoder.encode(decoded, "UTF-8"));
c.setMaxAge(3600);
response.addCookie(c);
%>
<%@ page pageEncoding="UTF-8" %>
<%
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
if ("username".equals(c.getName())) {
String val = URLDecoder.decode(c.getValue(), "UTF-8");
out.println(val); // 正確顯示中文
}
}
}
%>
URLEncoder.encode("中文", "UTF-8"),實測在 Firefox 下仍會亂碼。getBytes("ISO-8859-1") → new String(..., "GB2312") 可修正容器預設 ISO-8859-1 解碼導致的字節錯位。URLEncoder.encode(name, "UTF-8"),前提是 request.setCharacterEncoding("UTF-8") 已在 Filter 中統一設定。addCookie.jsp?name=測試名字 寫入 Cookie。getCookie.jsp 驗證顯示「測試名字」。