如何将Unicode字符作为JSP/Servlet请求的request.getParameter参数传递?

17
经过多次尝试,我仍然无法解决问题。JSP、servlet 和数据库都已设置为接受 UTF-8 编码,但是每当我在任何带有两个字节字符(如 em 破折号)的参数上使用 request.getParameter 时,它们就会变成乱码。 我已经手动向数据库提交了含有这些字符的文本,没有任何问题。如果我从 servlet 中提取文本并在 JSP 页面的表单中打印出来,它也正常显示。 唯一发现出现乱码的情况是在使用 request.getParameter 检索后再尝试在其他地方显示时。 有其他人遇到过这个问题吗?我该如何解决?

客户端是否也发送UTF-8编码的内容到服务器? - Romain
我相信是这样的,但我怎么能确定呢? - user707053
5个回答

24

如果请求和/或响应编码未正确设置,这种情况就会发生。

对于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来完成。

enter image description here

请注意,当页面通过HTTP提供时,HTML <meta http-equiv>标签会被忽略。仅在通过file://从本地磁盘文件系统打开页面时才被考虑。此外,在指定<form accept-charset>时是不必要的,因为它已默认为用于响应HTML页面的响应编码。请参见W3 HTML规范

另请参阅:


3
巴鲁斯C的回答是正确的,但我想补充一点,在POST方法中很重要的是(当然):
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或其他编码也没有效果。


1

-1

只想补充一点,以防其他人犯了和我一样的错误,忽视了 POST 方法

阅读了所有这些解决方案,并将其应用于我的代码,但仍然无法正常工作,因为我忘记在我的<form>标记中添加 method="POST"


-1

按照此处所述使用过滤器: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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,