无法让Servlet以UTF-8的形式处理请求内容

时间:2009-07-14 14:26:30

标签: java tomcat utf-8 internationalization

我正在将旧版应用程序从ISO-8859-1转换为UTF-8,并且我已经使用了许多资源来确定我需要设置什么才能使其工作。但是,在几次配置,代码和环境更改之后,我的Servlet(在Tomcat 5中)似乎不会将提交的HTML表单内容处理为UTF-8。

这是我为配置设置的内容。

  • 系统属性
[user@server ~]$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
  • tomcat5 server.xml
<Connector protocol="HTTP/1.1"
    ...
    URIEncoding="UTF-8"
    useBodyEncodingForURI="true"/>
  • JSP文件
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8" %>
...
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  • Servlet过滤器
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
{
    if(request.getCharacterEncoding() == null)
    {
        request.setCharacterEncoding("UTF-8");
    }
    ...

使用一些调试日志,我知道以下内容:

System.getProperty("file.encoding"): "UTF-8"
java.nio.charset.Charset.defaultCharset(): "UTF-8"
new OutputStreamWriter(new ByteArrayOutputStream()).getEncoding(): "UTF8"

但是,当我使用包含“Битьбаклуши”的输入提交表单时,我会看到以下内容(来自我的日志):

request.getParameter("myParameter") = Ð\221иÑ\202Ñ\214 баклÑ\203Ñ\210Ð

我知道请求内容类型为null,因此在我的servlet过滤器中显式设置为“UTF-8”。此外,我正在从终端查看我的日志,我知道其编码也设置为UTF-8。

我在这里缺少什么? 我还需要设置什么才能让Servlet正确处理输入为UTF-8?如果有更多信息可以提供帮助,我很乐意添加更多调试并用它来更新这个问题。< / p>

修改

  • 我没有使用Windows终端(我使用的是PuTTY),所以我很确定问题不在于我正在查看日志。这是因为当我使用提交的内容将我的回复发送回浏览器并将其输出时,它与上面的垃圾一样。
  • 表格是从IE8提交的。

解决方案:

我的CharsetFilter的web.xml定义太过分了(在我的servlet配置和其他过滤器下面)。我将过滤器定义移动到web.xml文档的最顶层,一切正常。请参阅下面接受的答案。

2 个答案:

答案 0 :(得分:5)

Edit4 (根据要求提供最终和更正的答案)

您的servlet过滤器应用得太晚了。

可能的正确顺序是web.xml如下

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/j2ee/dtds/web-app_2.3.dtd">

<web-app>
    <!--CharsetFilter start--> 
    <filter>
        <filter-name>Charset Filter</filter-name>
        <filter-class>CharsetFilter</filter-class>
        <init-param>
            <param-name>requestEncoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <!-- The rest is ommited -->

答案 1 :(得分:1)

起初我认为这个问题很容易解决,但我花了2天的时间来搞清楚。这是我的发现,我希望它有所帮助 1)您需要在JSP中使用以下代码

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

如果您有许多JPS页面,那么您可以在web.xml中使用以下代码,如下所述:How can I cleanly set the pageEncoding of all my JSPs?

2)确保在读取servlet中的任何参数之前,已经将字符编码设置为UTF-8

request.setCharacterEncoding("UTF-8");

我已经在我自己的过滤器中完成了它(在chain.doFilter之前的第一个过滤器。

3)您的数据库必须支持UTF-8,因此请确保您已将更改应用于表和列。为了确保它工作正常只需用日语输入一些单词并保存。如果表格中包含内容,则表示没问题。

4)最后也是最重要的一个是数据库的连接字符串。即使我的所有数据库和表都支持UTF8,但这个额外的行是我可以将我的内容保存到数据库中的原因。 因此,请确保将characterEncoding = UTF8添加到您的连接字符串中,如下所示

jdbc:mysql://127.0.0.1:3306/my_daabase?characterEncoding=UTF8

对于enctype =&#34的多页面; multipart / form-data&#34;你需要做一个额外的步骤。当您通过getString方法读取FileItem时,请确保将其更改为getString(&#34; UTF-8&#34;)然后这应该没问题。