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

前端之家收集整理的这篇文章主要介绍了jsf – 提交表单后在输入中重新显示损坏的字符前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我通常可以将捷克字符串写入表单:

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

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>

解决方法

鉴于症状,使用ISO-8859-x编码重新显示UTF-8数据. č( LATIN SMALL LETTER C WITH CARON (U+010D))以UTF-8存在,字节为0xC4和0x8D.根据 ISO-8859-1 codepage layout,这些字节分别代表字符Ä和[nothing],这正是你所看到的.

这个特殊问题可能有很多原因.由于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

猜你在找的HTML相关文章