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

gaf*_*fcz 8 jsf utf-8 character-encoding

我通常可以写捷克字符串到表单:

在此输入图像描述

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

在此输入图像描述

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

我应该在哪里寻找问题?

更新: HTTP响应标头:

在此输入图像描述

解:

  • request.setCharacterEncoding("UTF-8")in 创建过滤器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>

Bal*_*usC 4

鉴于这些症状,UTF-8 数据将使用 ISO-8859-x 编码重新显示。\xc4\x8d(拉丁文小写字母 C 带 CARON (U+010D) )存在于 UTF-8 字节0xC4和中0x8D。根据ISO-8859-1 代码页布局,这些字节分别代表字符\xc3\x84和[无],这正是您所看到的。

\n\n

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

\n\n

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

\n\n
request.setCharacterEncoding("UTF-8");\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
    \n
  1. DB 表未使用 UTF-8。
  2. \n
  3. JDBC 驱动程序未使用 UTF-8。
  4. \n
\n\n

具体如何解决取决于所使用的DB服务器。通常您需要在CREATE数据库表中指定字符集,但您通常也可以使用 来更改它ALTER。对于 JDBC 驱动程序,通常通过显式指定字符集作为连接 URL 参数来解决这个问题。例如,对于 MySQL:

\n\n
request.setCharacterEncoding("UTF-8");\n
Run Code Online (Sandbox Code Playgroud)\n\n

也可以看看:

\n\n\n