jsf - 在 JSF 1.2 中使用错误编码的 POST 参数

标签 jsf utf-8 character-encoding facelets tomcat7

我在我的 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());
}

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

  • 你知道我还能测试什么吗?我的错误假设是什么?

    提前致谢!

    最佳答案

    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

    谢谢大家!

    关于jsf - 在 JSF 1.2 中使用错误编码的 POST 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8609994/

    相关文章:

    c# - 如何将俄语字符串转换为西里尔字母?

    r - fread(R 中的 data.table)以及编码规范

    javascript - OutputScript 不加载我的 JavaScript 源

    java - 如何更新托管bean的属性成员变量?

    javascript - 如何动态加载不同的处理实例

    php - mysql 将urlencoded数据存入数据库

    Java:使用 PDFBox 将国家字符写入 PDF

    jsp - jsp中的绝对网址

    php - 如何在php中回显ascii加密文本

    mysql - mysql 转储中的非常奇怪的字符——怎么办?