亂碼是 Web 開發「頭號難題」,本文從原理層面剖析亂碼產生機制,提供請求參數、響應輸出、文件讀寫全鏈路編碼統一策略。
<!-- Request_01.jsp: pageEncoding=gbk -->
<form action="request_02.jsp" method="post">
請輸入信息:<input type="text" name="info">
<input type="submit" value="提交">
</form>
<!-- Request_02.jsp: pageEncoding=gbk -->
<% String content = request.getParameter("info"); %>
<h2><%=content%></h2>
現象:瀏覽器按 UTF-8 編碼發送,Tomcat 默認按 ISO-8859-1 解碼 → 亂碼。
<% request.setCharacterEncoding("UTF-8"); %> <-- 必須在 getParameter() 前調用 -->
String content = request.getParameter("info");
原理:覆蓋容器默認解碼字符集。注意:對 GET 請求無效(Tomcat 5.5+ 需配置 URIEncoding)。
修改 server.xml 中 Connector 節點:
<Connector port="8080" URIEncoding="UTF-8" />
強制容器按 UTF-8 解碼 URL 參數。
response.setContentType("text/html;charset=UTF-8");
或頁面指令:<%@ page contentType="text/html;charset=UTF-8" %>
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 映射 /*,一次配置全局生效。