【问题标题】:POST parameters using wrong encoding in JSF 1.2在 JSF 1.2 中使用错误编码的 POST 参数
【发布时间】:2012-01-26 10:56:17
【问题描述】:

我在我的 Web 应用程序(JSF 1.2、Spring 和 Tomcat 7)中遇到字符集编码问题,并且我已经想不出要测试什么来查看哪里出错了。

每当我提交类似 'çã' 的内容时,我都会得到 'çã':这意味着我以 UTF-8 发布的数据在 JSF 生活的某个地方被转换为 ISO-8859-1循环。

我知道错误的转换是 UTF-8 到 ISO-8859-1,因为它是相同的输出:

System.out.println(new String("çã".getBytes("UTF-8"), "ISO-8859-1"));

我认为错误的转换是在 JSF 生命周期中的某个地方(可能是之前?),因为我在我的 MB 中设置了一个验证器:

public void debugValidator(FacesContext context, UIComponent component,
        Object object) throws ValidationException {
    System.out.println("debug validator:");
    System.out.println(object);
    System.out.println("\n");
    throw new ValidationException("DEBUG: " + object.toString());
}

它的消息返回为:“DEBUG:çã”

  • 我在所有 .xhtml 页面中的第一行都是<?xml version="1.0" encoding="UTF-8"?>
  • 我正在使用 Facelets,根据BalusC's article,它默认使用 UTF-8
  • 所以它不需要,但我还是设置了 Spring 的 CharacterEncodingFilter 在我的 web.xml 中将请求字符编码设置为 UTF-8。
  • 我把URIEncoding="UTF-8"放在Tomcat的server.xml文件中,只是为了保证
  • 不是我浏览器的错,在控制台打印一样的东西,我的环境都是UTF-8

您知道我还可以测试什么吗?我的错误假设可能是什么?

提前致谢!

【问题讨论】:

    标签: jsf utf-8 character-encoding facelets tomcat7


    【解决方案1】:

    BalusC 的回答帮助我更好地理解了这个问题,但为我解决的问题是将字符编码过滤器作为 链中的第一个过滤器(将它放在 web.xml 文件)。

    这是我使用的过滤器:

    <!-- filter enforcing charset UTF-8 - must be first filter in the chain! -->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    显然,数据是在过滤器设置参数之前读取的。 我从这个页面得到了提示:http://tech.top21.de/techblog/20100421-solving-problems-with-request-parameter-encoding.html

    谢谢大家!

    【讨论】:

      【解决方案2】:

      这些症状表明浏览器已使用 ISO-8859-1 编码而不是 UTF-8 发送数据。这反过来意味着 HTTP 响应 Content-Type 标头没有设置正确的 charset 属性。以 Firebug 为例,您可以通过以下方式找到它:

      Facelets 默认使用 UTF-8 是对的。但是非常早期的 Facelets 版本并没有默认使用 UTF-8。另见issue 46issue 53。 Facelets 目前位于1.1.15.B1

      至于您尝试修复它,XML prolog 的存在并不是绝对必要的,并且它的编码不以任何方式用于设置响应编码,它仅由 XML 解析器用于将输入流解码为字符. Spring 的过滤器也不是必需的,但是添加后它并没有解决问题,这足以证明是客户端将数据发送为 ISO-8859-1。

      【讨论】:

      • 嗨,BalusC,感谢您的回答,但我认为情况正好相反,因为 Content-type 标头设置为 UTF-8。现在,我刚刚检查了是否将浏览器中的编码手动更改为 ISO-8859-1,字符显示在验证器消息中!现在,这是什么意思?
      • 关于 Facelets,我使用的是 1.1.15.B1 btw。
      • 浏览器是否有可能以 ISO-8859-1 格式发送数据,尽管 Content-type 设置为 text/html;charset=UTF-8 ?
      • 我解决了将字符编码过滤器作为链中第一个的问题!我现在觉得很愚蠢... :D 感谢您的帮助!
      【解决方案3】:

      检查您的表单是否包含enctype="multipart/form-data"

      查看this question 以获取更多信息

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-13
        • 1970-01-01
        • 2014-12-16
        • 2012-04-06
        • 2012-01-09
        • 2012-06-15
        • 1970-01-01
        • 2010-12-15
        相关资源
        最近更新 更多