如果请求和/或响应编码未正确设置,这种情况就会发生。
对于GET请求,您需要在servlet容器级别进行配置。不清楚您使用的是哪一个,但例如对于Tomcat,可以通过其/conf/server.xml
中<Connector>
元素中的URIEncoding
属性来完成。
<Connector ... URIEncoding="UTF-8">
对于POST请求,您需要创建一个过滤器,该过滤器映射到所需的URL模式,涵盖所有这些POST请求。例如:*.jsp
甚至是/*
。在doFilter()
中执行以下操作:
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
对于HTML响应和客户端提交的HTML表单输入值进行编码,您需要设置JSP页面编码。将此添加到JSP的顶部(考虑到从DB直接显示UTF-8没有问题,您可能已经做得很好了)。
<%@page pageEncoding="UTF-8" %>
或者为了防止将此复制粘贴到每个JSP中,请在web.xml
中进行一次配置:
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<page-encoding>UTF-8</page-encoding>
</jsp-property-group>
</jsp-config>
对于源代码文件和标准输出(IDE控制台),您需要设置IDE工作区编码。不清楚您正在使用哪个IDE,但例如对于Eclipse,可以通过将“Window > Preferences > General > Workspace > Text File Encoding”设置为UTF-8来完成。
请注意,当页面通过HTTP提供时,HTML <meta http-equiv>
标签会被忽略。仅在通过file://
从本地磁盘文件系统打开页面时才被考虑。此外,在指定<form accept-charset>
时是不必要的,因为它已默认为用于响应HTML页面的响应编码。请参见W3 HTML规范。
request.setCharacterEncoding("UTF-8");
在读取任何参数之前,必须调用该函数。以下是读取参数的实现方式:
@Override
public String getParameter(String name) {
if (!parametersParsed) {
parseParameters();
}
return coyoteRequest.getParameters().getParameter(name);
}
正如您所看到的,存在一个标志parametersParsed,当您第一次读取任何参数时设置,parseParameters()方法将解析请求的所有参数并设置编码。调用:
request.setCharacterEncoding("UTF-8");
在参数解析完成后设置编码已经没有效果了!这就是为什么有些人抱怨设置请求编码不起作用的原因。 大多数答案建议使用Servlet过滤器并在那里设置字符编码。这是正确的,但也请注意,某些安全库可能会在您的过滤器之前读取请求参数(这就是我的情况),所以如果您的过滤器在此之后执行,则请求参数的字符编码已经设置,并且设置UTF-8或其他编码也没有效果。
只想补充一点,以防其他人犯了和我一样的错误,忽视了 POST 方法
阅读了所有这些解决方案,并将其应用于我的代码,但仍然无法正常工作,因为我忘记在我的<form>
标记中添加 method="POST"
按照此处所述使用过滤器:https://www.baeldung.com/tomcat-utf-8
附注:如果您正在使用没有默认方法的JDK 8,您可以轻松地定义空方法“init”和“destroy”来解决问题:
package sample;
import javax.servlet.*;
import java.io.IOException;
public class CharacterSetFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
}
public void destroy() {
}
}
然后,在web.xml文件中:
<filter>
<filter-name>CharacterSetFilter</filter-name>
<filter-class>sample.CharacterSetFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterSetFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>