在 Java Web 开发中,Servlet 防止乱码的核心原则是:
请求和响应都要明确指定字符编码,并且要在读取/输出数据之前设置。
下面按常见场景说明。
POST 请求体中的参数需要设置:
request.setCharacterEncoding("UTF-8");
✅ 必须在 第一次调用 request.getParameter() 之前 设置。
示例:
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
}
GET 参数在 URL 中,Tomcat 默认按 ISO-8859-1 解码。
String name = request.getParameter("name");
name = new String(name.getBytes("ISO-8859-1"), "UTF-8");
在 conf/server.xml 中:
<Connector URIEncoding="UTF-8" ... />
response.setContentType("text/html;charset=UTF-8");
或者分开写:
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
✅ 必须在 response.getWriter() 之前 设置。
示例:
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("中文");
JSP 顶部加:
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
public class EncodingFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain)
throws IOException, ServletException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
chain.doFilter(req, resp);
}
}
web.xml 配置:
<filter>
<filter-name>encoding</filter-name>
<filter-class>com.example.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
| 原因 | 解决 |
|---|---|
| 没设 request 编码 | setCharacterEncoding("UTF-8") |
| GET 默认 ISO | Tomcat URIEncoding |
| 响应未设编码 | setContentType("text/html;charset=UTF-8") |
| JSP 编码不一致 | pageEncoding + contentType |
| 数据库编码不一致 | 数据库、连接串统一 UTF-8 |
如果你用的是 Spring Boot / Spring MVC,也可以告诉我,我可以直接给你对应的最佳实践。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。