JSF表格和德国变形金刚

时间:2010-01-05 15:06:17

标签: jsp jsf character-encoding richfaces

我在我的一个JSF(这是一个facelet)中遇到了一个奇怪的问题。我正在使用Richfaces,在一个页面上我得到了一个正常的表格

<h:form></h:form>

我的问题是,当我提交表格时,所有UTF-8字符 - 就像德语变音符号(äöü)一样 - 都是加密的。如果我在浏览器上将页面更改为ISO-8859-1,则可以正常工作。

如果我使用属性

展开表单
<h:form id="register-form" acceptcharset="ISO-8859-1">

它也有效。 (仅适用于德语变音符号) - 其他UTF-8字符将被加密为不可读的内容。

有人可以帮我这个吗?

4 个答案:

答案 0 :(得分:1)

您需要按HttpServletRequest#setCharacterEncoding()设置POST 请求编码。最佳位置是Filter,它映射在所需的url-pattern上。为了获得统治世界,你当然希望一直使用UTF-8doFilter()方法基本上如下:

if (request.getCharacterEncoding() == null) {
    request.setCharacterEncoding("UTF-8");
}
chain.doFilter(request, response);

然而,这不是您在字符编码方面需要考虑的唯一因素。有关Java EE Web应用程序的更多背景信息和其他(详细)解决方案,您可能会发现本文也很有用:Unicode - How to get the characters right?

更新:根据评论:

  

我已经实现了一个过滤器 - 稍微谷歌之后。但它对我的问题没有影响。

然后问题出在用于存储/显示字符的工具中。你是怎么发现角色乱码的?在日志记录中?如果是这样,它是否使用UTF-8?或者它是在日志文件查看器/控制台中?如果是这样,它是否使用UTF-8?或者它在数据库表中?如果是这样,它是否使用UTF-8?或者它是在数据库管理工具中?如果是这样,它是否使用UTF-8?或者它在结果页面中?如果是这样,它是否使用UTF-8? Etcetera ..浏览前面提到的链接的解决方案部分如何使它们正确。

答案 1 :(得分:0)

这是正确的行为。 UTF-8意味着你想要Unicode字符(即非ASCII或任何&gt; = charpoint 128)必须用两个字节编码。

但是您的JSF框架应该在您的代码可以看到之前将数据解码为Unicode字符串。所以我的猜测是你没有指定页面或表单的编码,因此,你的框架只能猜测它得到了什么。始终将acceptcharset设置为utf-8,将整个HTML页面的编码设置为相同(使用meta标记)。

然后它应该工作。

链接:Tips for JSF character encoding

答案 2 :(得分:0)

<?xml version="1.0" encoding="UTF-8" ?>

在您的网页上,它应该可以正常工作。

此外:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

在您的模板中(或者,再次,在每个页面中,如果不使用模板)

我目前正在制作一个utf-8项目,并且除了每个jsp / xhtml的ontop之外,还没有设置UTF-8。

我无法回想起场景背后发生了什么,但我认为这一行(<?xml)正在指示facelets应该使用什么编码。此行不会发送到浏览器。

P.S。以上仅在MyFaces下进行测试(无所谓,但仍然......)

答案 3 :(得分:0)

怎么样

<h:form id="register-form" acceptcharset="UTF-8">

并不是真的意味着修复,但如果这使得所有角色都有效,那么它表明你真正的问题是包含该表单的页面被声明为US-ASCII。浏览器通常会在页面编码中发送表单提交,除非acceptcharset另有说明。

但是很难诊断webapps中的编码问题,因为编码涉及很多潜在的失败点。当您对编码的理解与您错误的术语(“UTF-8字符”)所表示的一样不稳定时,尤其困难。我建议你先阅读The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

阅读完毕后,请查看表单页面的HTML源代码以及该页面的HTTP标头和表单请求,以查看正在使用的编码。然后你应该能够找出出错的地方。