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

时间:2012-05-09 13:36:54

标签: jsp servlets unicode character-encoding mojibake

经过大量的反复试验后,我仍然无法弄清楚问题。 JSP,servlet和数据库都被设置为接受UTF-8编码,但即使我在任何具有任何双字节字符的东西上使用request.getParameter,就像em dash一样,它们也会被破坏为字符。

我已经对数据库进行了手动提交,并且能够接受这些字符,没问题。如果我从servlet中的数据库中提取文本并在jsp页面的表单中打印它就没有问题。

我唯一一次发现它是以破碎的字符形式返回的,当我尝试在使用request.getParameter检索它之后将其显示在其他地方时。

还有其他人有这个问题吗?我该如何解决?

4 个答案:

答案 0 :(得分:21)

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

对于GET请求,您需要在servletcontainer级别配置它。目前还不清楚你正在使用哪一个,但是对于示例Tomcat来说,要由URIEncoding<Connector>元素中的/conf/server.xml属性来完成。

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

对于POST请求,您需要创建一个filter,该enter image description here映射到涵盖所有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&gt;来完成。偏好&gt;一般&gt;工作区&gt;文本文件编码为UTF-8。

W3 HTML specification

请注意,当通过HTTP提供网页时,HTML <meta http-equiv>代码会被忽略。仅在通过file://从本地磁盘文件系统打开页面时才考虑它。另外指定<form accept-charset>是不必要的,因为它已经默认为在使用表单提供HTML页面期间使用的响应编码。另请参阅Unicode - How to get the characters right?

另见:

答案 1 :(得分:2)

Tomcat FAQ很好地介绍了这个主题。尤其: http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q8http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q4

FAQ中给出的测试JSP基本上是我在几年前通过Tomcat修复各种编码问题时使用的。

答案 2 :(得分:2)

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或任何其他将没有效果。

答案 3 :(得分:-1)

只是想补充一点,以防其他人犯了与我错误的错误 POST方法

阅读所有这些解决方案并应用于我的代码,但它仍然无效,因为我忘记在method="POST"标记中添加<form>