【问题标题】:How to pass Unicode characters as JSP/Servlet request.getParameter?如何将 Unicode 字符作为 JSP/Servlet request.getParameter 传递?
【发布时间】:2012-05-18 00:54:35
【问题描述】:

经过多次反复试验,我仍然无法找出问题所在。 JSP、servlet 和数据库都设置为接受 UTF-8 编码,但即使我在任何具有任何两字节字符(如 em dash)的东西上使用 request.getParameter 时,它们也会被打乱为损坏的字符。

我已经手动提交到数据库,它能够接受这些字符,没问题。如果我在 servlet 中从数据库中提取文本并以我的 jsp 页面形式打印它,它不会显示任何问题。

我唯一一次发现它作为损坏的字符返回是当我使用 request.getParameter 检索它后尝试在其他地方显示它时。

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

【问题讨论】:

  • 客户端是否也在向服务器发送 UTF-8 编码的内容?
  • 我相信是的,但我怎么能确定呢?

标签: jsp servlets unicode character-encoding mojibake


【解决方案1】:

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

对于 GET 请求,您需要在 servletcontainer 级别进行配置。目前尚不清楚您使用的是哪一个,但例如 Tomcat,这将由其 <Connector> 元素中的 URIEncoding 属性在其 /conf/server.xml 中完成。

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

对于 POST 请求,您需要创建一个 filter,它映射到涵盖所有这些 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>

对于源代码文件和标准输出(IDE 控制台),您需要设置 IDE 工作区编码。目前尚不清楚您使用的是哪一个,但例如 Eclipse,通过将 Window > Preferences > General > Workspace > Text File Encoding 设置为 UTF-8 来完成。

请注意,当通过 HTTP 提供页面时,HTML &lt;meta http-equiv&gt; 标记将被忽略。仅当通过file:// 从本地磁盘文件系统打开页面时才考虑。还没有必要指定&lt;form accept-charset&gt;,因为它已经默认为在使用表单提供 HTML 页面期间使用的响应编码。另见W3 HTML specification

另见:

【讨论】:

    【解决方案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】:

      Tomcat FAQ 很好地涵盖了这个主题。特别: http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q8http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q4

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

      【讨论】:

        【解决方案4】:

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

        阅读所有这些解决方案并应用于我的代码,但它仍然不起作用,因为我忘记在我的 &lt;form&gt; 标签中添加 method="POST"

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-11-14
          • 2012-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多