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

oug3syen  于 2022-12-07  发布在  其他
关注(0)|答案(5)|浏览(138)

JSP、servlet和数据库都设置为接受UTF-8编码,但即使如此,每当我在任何包含双字节字符(如em破折号)的对象上使用request.getParameter时,它们也会被打乱,成为不完整的字符。
我已经手动提交到数据库,它能够接受这些字符,没有问题。如果我从servlet中的数据库中提取文本,并在jsp页面的表单中打印它,它显示没有问题。
唯一一次我发现它返回时显示为不完整的字符,是在使用request. getParameter检索它之后,我尝试在其他地方显示它。
其他人有过这个问题吗?我该如何解决?

roqulrg3

roqulrg31#

如果请求和/或响应编码根本没有正确设置,就会发生这种情况。
对于GET请求,你需要在servlet容器级别配置它。不清楚你使用的是哪一个,但是对于Tomcat,这将通过/conf/server.xml<Connector>元素的URIEncoding属性来完成。

<Connector ... URIEncoding="UTF-8">

对于POST请求,您需要创建一个filter,它Map到覆盖所有这些POST请求的所需URL模式上。例如*.jsp什至/*。在doFilter()中执行以下工作:

request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);

对于HTML响应和提交的HTML表单输入值的客户端编码,您需要设置JSP页面编码。将此编码添加到JSP的顶部(您可能已经正确地完成了此操作,因为显示UTF-8直接表单DB可以正常工作)。

<%@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>

对于源代码文件和stdout(IDE控制台),您需要设置IDE工作区编码。不清楚您使用的是哪一种,但对于Eclipse,可以通过将 Window〉Preferences〉General〉Workspace〉Text File Encoding 设置为UTF-8来完成。

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

另请参阅:

3pvhb19x

3pvhb19x2#

BalusC的答案是正确的,但我只想补充一点,这一点很重要(当然是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或任何其他编码都不会有任何效果。

jm2pwxwz

jm2pwxwz3#

Tomcat常见问题解答很好地涵盖了这个主题。http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q8http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q4
FAQ中给出的测试JSP实际上就是我几年前在Tomcat中修复各种编码问题时使用的JSP。

zvokhttg

zvokhttg4#

只是想补充一点,以防其他人犯了和我一样的错误,我忽略了POST方法
阅读所有这些解决方案并应用到我的代码中,但它仍然不起作用,因为我忘记在我的<form>标签中添加method="POST"

gorkyyrv

gorkyyrv5#

使用如下所述的过滤器:https://www.baeldung.com/tomcat-utf-8
P.S.如果您使用的是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>

相关问题