提交表单后,在输入中重新显示损坏的字符

时间:2011-11-07 10:33:22

标签: jsf utf-8 character-encoding

我通常可以将捷克字符串写入表格:

enter image description here

但是在验证之后(以及当我将收集的字符串发送到数据库时)字符串在其他字符集中:

enter image description here

h:outputTexts(jméno,příjmení)仍然正常显示,h:inputTexts不是。

我应该在哪里寻找问题?

更新: HTTP响应标头:

enter image description here

解决方案:

  • request.setCharacterEncoding("UTF-8")
  • 中使用Filter#doFilter()创建过滤器
  • 检查所有xml是否配置了UTF-8
  • <f:view contentType="text/html" encoding="UTF-8"/>添加到主xhtml
  • 将这些行添加到hibernate.cfg.xml:

    <property name="hibernate.connection.characterEncoding">utf8</property>

    <property name="hibernate.connection.useUnicode">true</property>

3 个答案:

答案 0 :(得分:4)

尝试此解决方案:http://ibnaziz.wordpress.com/2008/06/10/spring-utf-8-conversion-using-characterencodingfilter/ 在我的情况下,它有助于(俄语)

在web.xml中添加Spring的字符编码过滤器:

<filter>
    <filter-name>encodingFilter</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>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
 </filter-mapping>

答案 1 :(得分:4)

鉴于症状,使用ISO-8859-x编码重新显示了UTF-8数据。 čLATIN SMALL LETTER C WITH CARON (U+010D))以字节0xC40x8D的UTF-8存在。根据{{​​3}},这些字节分别代表字符Ä和[nothing],这正是您所看到的。

这个特殊问题可能有很多原因。由于Facelets本身已经使用UTF-8 默认来处理HTTP POST请求参数并编写HTTP响应,因此在Java / JSF端应该/不需要修改/更改任何内容。

但是,当您在JSF创建/恢复视图之前手动抓取请求参数(例如在自定义过滤器中)时,Facelets可能为时太晚而无法设置正确的请求字符编码。您需要在继续链之前将以下行添加到自定义过滤器,或者在过滤器之前映射的新过滤器中导致问题:

request.setCharacterEncoding("UTF-8");

此外,当您通过例如<?xml version="1.0" charset="ISO-8859-1"?><f:view encoding="ISO-8859-1">显式/隐式更改Facelets的默认字符编码时,Facelets将使用ISO-8859-1。您需要将其替换为UTF-8或完全删除它们。

如果不是这样,那么只有数据库方面才是主要的嫌疑人。在那一方面,我可以看到两个可能的原因:

  1. 数据库表未使用UTF-8。
  2. JDBC驱动程序未使用UTF-8。
  3. 如何解决这个问题取决于所使用的数据库服务器。通常,您需要在数据库表的CREATE期间指定字符集,但通常也可以使用ALTER更改它。对于JDBC驱动程序,通常通过将charset明确指定为连接URL参数来解决。例如,在MySQL的情况下:

    jdbc:mysql://localhost:3306/db_name?useUnicode=yes&characterEncoding=UTF-8
    

    另见:

答案 2 :(得分:0)

我在验证表格上遇到了完全相同的问题,我用谢尔盖的答案解决了这个问题。

但是您的过滤器需要位于web.xml的第一位置。将我的过滤器从第3位移到第一位解决了我的问题。

希望它有所帮助。

(Primefaces 3.2,JSF 2.1.2 with Jboss 7.1)