Tomcat 作為主流 JSP/Servlet 容器,在中文環境下常遭遇編碼問題。本文針對 Tomcat 4.0/4.1 整理六大常見亂碼場景,提供可直接套用的工具方法與配置技巧,經中文 Windows 98/2000 + JDK 1.3.1 實測有效。
public class EncodingUtil {
// ISO-8859-1 → GB2312
public static String toChinese(String input) {
try {
byte[] bytes = input.getBytes("ISO-8859-1");
return new String(bytes, "GB2312");
} catch (Exception e) { return null; }
}
// URL 編碼
public static String encode(String value) {
if (value == null || value.isEmpty()) return "";
try { return java.net.URLEncoder.encode(value, "UTF-8"); }
catch (Exception e) { return ""; }
}
// URL 解碼
public static String decode(String value) {
if (value == null || value.isEmpty()) return "";
try { return java.net.URLDecoder.decode(value, "UTF-8"); }
catch (Exception e) { return ""; }
}
}
頁面未指定字元集。在 JSP 頂部加入:
<%@ page contentType="text/html; charset=GB2312" %>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312">
Tomcat 4.1 預設以 ISO-8859-1 解讀 POST。
// 單一參數
String val = EncodingUtil.toChinese(request.getParameter("name"));
// 多值參數
String[] vals = request.getParameterValues("name");
if (vals != null) {
for (int i = 0; i < vals.length; i++) {
vals[i] = EncodingUtil.toChinese(vals[i]);
}
}
同樣需轉碼,但 Tomcat 4.0 下 page.jsp?username=中文 無法直接用此法。
String val = EncodingUtil.toChinese(request.getParameter("username"));
| 版本 | 寫入 | 讀取 |
|---|---|---|
| Tomcat 4.0 | 自動編碼 | decode(cookie.getValue()) |
| Tomcat 4.1 | new Cookie(name, encode("中文")) | decode(cookie.getValue()) |
引擎限制,改用 URL 編碼傳遞:
// 產生連結
String url = "page.jsp?username=" + EncodingUtil.encode("中文");
// 取回
String val = EncodingUtil.toChinese(request.getParameter("username"));
暫無通用方案,建議在 Controller 層統一轉碼後再注入 Bean。
web.xml 設定 Filter 統一處理請求/回應編碼server.xml <Connector> 加入 URIEncoding="UTF-8"掌握編碼流向(瀏覽器 → HTTP → Servlet → JVM → 資料庫),並在邊界統一轉碼,是徹底解決中文亂碼的關鍵。