我通常可以将捷克字符串写入表格:
但是在验证之后(以及当我将收集的字符串发送到数据库时)字符串在其他字符集中:
h:outputTexts
(jméno,příjmení)仍然正常显示,h:inputTexts
不是。
我应该在哪里寻找问题?
更新: HTTP响应标头:
解决方案:
request.setCharacterEncoding("UTF-8")
Filter#doFilter()
创建过滤器
<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>
答案 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))以字节0xC4
和0x8D
的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
或完全删除它们。
如果不是这样,那么只有数据库方面才是主要的嫌疑人。在那一方面,我可以看到两个可能的原因:
如何解决这个问题取决于所使用的数据库服务器。通常,您需要在数据库表的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)