2011-12-22 41 views
4

我在我的web应用程序(JSF 1.2,Spring和Tomcat 7)中遇到了charset编码问题,并且我已经用尽了测试的想法以查看它在哪里出错了。在JSF 1.2中使用错误编码的POST参数

每当我提出类似“钙”我得到“çã”:这意味着我的数据发布为UTF-8被转换为ISO-8859-1在JSF生命周期的某个地方。

我知道错了转换为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的CharacterEncodingFilterweb.xml中设置请求字符编码UTF-8。
  • 我把URIEncoding="UTF-8" Tomcat的server.xml文件,只是为了保证
  • 这不是我的浏览器的错,它打印在控制台同样的事情,我的环境是所有UTF-8

您对我还能测试什么有什么想法吗?什么可能是我的错误假设?

在此先感谢!

回答

7

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

谢谢大家!

3

症状表明浏览器使用ISO-8859-1编码而不是UTF-8发送了数据。这反过来意味着HTTP响应Content-Type标题未使用正确的charset属性进行设置。在比如萤火虫,你可以找到它列如下:

enter image description here

你说得对,Facelets的默认使用UTF-8。但Facelets的早期版本默认没有编程为使用UTF-8。另见issue 46issue 53。 Facelets目前在1.1.15.B1

至于你试图修复它,XML prolog的存在并不是严格必要的,它的编码没有以任何方式用于设置响应编码,它只被XML解析器用来解码输入流为字符。 Spring的过滤器也是没有必要的,但是它在添加完成后没有解决问题就足以证明它是以ISO-8859-1形式发送数据的客户端。

+0

嗨,BalusC,感谢您的回答,但我认为这是周围的其他方法,使Content-type头设置为UTF-8。现在,我已经检查过,如果手动将浏览器中的编码更改为ISO-8859-1,则字符将显示在验证器消息中!这是什么意思? – elias 2011-12-23 10:07:43

+0

关于Facelets,我正在使用1.1.15.B1顺便说一句。 – elias 2011-12-23 10:09:28

+0

尽管_Content-type_设置为_text/html; charset = UTF-8_,浏览器是否可能将数据发送为ISO-8859-1? – elias 2011-12-23 12:55:24

1

检查,如果您的表格有enctype="multipart/form-data"

this question形式更多信息