但是在验证之后(以及当我将收集的字符串发送到数据库时)字符串在其他一些字符集中:
h:outputTexts(jméno,příjmení)仍然正常显示,h:inputTexts不是.
我应该在哪里寻找问题?
更新:HTTP响应标头:
解:
>在Filter#doFilter()中使用request.setCharacterEncoding(“UTF-8”)创建过滤器
>检查所有xml以配置UTF-8
> add< 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>
解决方法
这个特殊问题可能有很多原因.由于Facelets本身已经默认使用UTF-8来处理HTTP POST请求参数并编写HTTP响应,因此在Java / JSF端应该/不需要修改/更改任何内容.
但是,当您在JSF创建/恢复视图之前手动抓取请求参数(例如在自定义过滤器中)时,Facelets可能为时太晚而无法设置正确的请求字符编码.在继续链之前,您需要将以下行添加到自定义过滤器,或者在过滤器导致问题之前映射的新过滤器中:
request.setCharacterEncoding("UTF-8");
此外,当您明确/隐式更改Facelets的默认字符编码时,例如<?xml version =“1.0”charset =“ISO-8859-1”?>或者< f:view encoding =“ISO-8859-1”>,然后Facelets将使用ISO-8859-1.您需要将其替换为UTF-8或完全删除它们.
如果不是这样,那么只有数据库方面才是主要的嫌疑人.在那方面,我可以看到两个可能的原因:
> DB表未使用UTF-8.
> JDBC驱动程序未使用UTF-8.
如何解决它取决于所使用的DB服务器.通常,您需要在DB表的CREATE期间指定charset,但通常也可以使用ALTER更改它.对于JDBC驱动程序,通常通过将charset明确指定为连接URL参数来解决.例如,在MysqL的情况下:
jdbc:MysqL://localhost:3306/db_name?useUnicode=yes&characterEncoding=UTF-8
也可以看看:
> Unicode – How to get the characters right?
> Unicode input retrieved via PrimeFaces input components become corrupted