在JSF 1.2中使用错误编码发布参数

在JSF 1.2中使用错误编码发布参数,jsf,utf-8,character-encoding,facelets,tomcat7,Jsf,Utf 8,Character Encoding,Facelets,Tomcat7,我的web应用程序(JSF1.2、Spring和Tomcat7)中的字符集编码有问题,我已经没有办法测试什么来确定哪里出了问题 每当我提交类似“çã”的内容时,我都会得到“çÔ:这意味着我发布为UTF-8的数据正在JSF生命周期的某个地方转换为ISO-8859-1 我知道错误的转换是UTF-8到ISO-8859-1,因为它的输出相同: System.out.println(new String("çã".getBytes("UTF-8"), "ISO-8859-1")); 我相信错误的转换

我的web应用程序(JSF1.2、Spring和Tomcat7)中的字符集编码有问题,我已经没有办法测试什么来确定哪里出了问题

每当我提交类似“çã”的内容时,我都会得到“çÔ:这意味着我发布为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页面的第一行都是
  • 我使用的是Facelets,它默认使用UTF-8
  • 所以不需要,但我还是在web.xml中设置了Spring的
    CharacterEncodingFilter
    ,将请求字符编码设置为UTF-8
  • 我将
    URIEncoding=“UTF-8”
    放在Tomcat的
    server.xml
    文件中,只是为了保证
  • 这不是我的浏览器的错误,它在控制台中打印相同的内容,并且我的环境都是UTF-8
你知道我还能测试什么吗?我的错误假设是什么


提前谢谢

症状表明浏览器使用ISO-8859-1编码而不是UTF-8发送数据。这反过来意味着HTTP响应
内容类型
头没有使用正确的
字符集
属性设置。例如,在Firebug中,您可以按如下方式找到它:

Facelets默认使用UTF-8是对的。但是Facelets的早期版本在默认情况下没有编程使用UTF-8。除其他外,请参见。Facelets目前位于


至于修复它的尝试,XML prolog的存在并不是绝对必要的,它的编码也不会以任何方式用于设置响应编码,它只被XML解析器用于将输入流解码为字符。Spring的过滤器也不是必需的,但它在您添加后并没有解决问题,这足以证明是客户机以ISO-8859-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>

字符编码滤波器
org.springframework.web.filter.CharacterEncodingFilter
编码
utf-8
强制编码
真的
字符编码滤波器
/*
显然,数据是在过滤器设置参数之前读取的。 我从这一页得到了提示:


谢谢大家

检查表单是否有
enctype=“多部分/表单数据”


查看表单更多信息

嗨,巴卢斯克,谢谢你的回答,但我认为情况正好相反,因为内容类型标题设置为UTF-8。现在,我刚刚检查了是否将浏览器中的编码手动更改为ISO-8859-1,字符将显示在验证程序消息中!现在,这意味着什么?关于Facelets,我使用的是1.1.15.B1 btw。尽管内容类型设置为text/html,但浏览器是否可能以ISO-8859-1的形式发送数据;charset=UTF-8?我解决了将字符编码过滤器作为链中第一个的问题!我现在觉得自己很愚蠢D谢谢你的帮助!