2010-01-05 71 views
4

我在我的一个JSF(这是一个facelet)中遇到了一个奇怪的问题。我使用RichFaces和一个页面上我有一个正常的形式JSF表单和德语变音模块

<h:form></h:form> 

我的问题是,当我提交表单的所有UTF-8字符 - 如德国变音(AOU) - 正在收到加密。如果我在浏览器上将页面更改为ISO-8859-1,它就可以工作。

如果我扩大与属性

<h:form id="register-form" acceptcharset="ISO-8859-1"> 

形式它也能工作。 (仅适用于德语元音变音) - 其他UTF-8字符将被加密成不可读的内容。

有没有人可以给我这个手?

+0

顺便说一句,这件事_might_一个问题(尽管它不应该) - MyFaces的或钻嘴鱼科? – Bozho 2010-01-05 15:36:25

+0

使用Mojarra。 – onigunn 2010-01-05 15:52:35

+0

等等,做了什么工作?这已经2周了.. – Bozho 2010-01-14 07:36:33

回答

1

您需要设置POST请求编码HttpServletRequest#setCharacterEncoding()。最好的地方是Filter,它被映射到所需的url-pattern。要获得统治世界,你当然想要始终使用UTF-8。该doFilter()方法基本上会是这样的:

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 ..通过上述链接的解决方案部分,如何让他们一切正常。

+0

我认为在这种情况下过滤器不是必需的。我正在制作一个西里尔(utf-8)应用程序,并且只将utf-8放置在每个jsp的ontop上。这使得它像魅力一样工作。 – Bozho 2010-01-05 15:25:05

+1

-1:设置请求的字符编码几乎从不是正确的事情,因为它只能掩盖其他地方发生的错误。 – 2010-01-05 15:25:48

+0

仅适用于响应处理,是的,但不适用于请求处理。 – BalusC 2010-01-05 15:26:02

0

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

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

然后它应该工作。

链接:Tips for JSF character encoding

0

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

ontop的网页的,它应该工作的罚款。

另外:

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

在你的模板(或再次,在每一个页面上,如果不使用模板)

目前,我正在做一个UTF-8项目,hanven't集UTF-8除了每个jsp/xhtml的顶部。

我不记得幕后究竟发生了什么,但我认为这条线(<?xml)的指示小面应该用什么编码。此行不会发送到浏览器。

P.S.以上是根据MyFaces的测试只(不应该的问题,但仍..)

+0

你真的不希望网页浏览器进入怪癖模式。 – BalusC 2010-01-05 15:26:49

+0

这并没有发送到浏览器 - 我认为这是指导facelets如何处理编码。 – Bozho 2010-01-05 15:28:54

+0

可以。尽管如此,他的问题也不是反应过程,而是要求处理。 – BalusC 2010-01-05 15:30:20

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头以及表单请求,以了解正在使用哪些编码。然后你应该能够找出事情出错的地方。

+0

-1:'acceptcharset'在MSIE中与响应编码不匹配时很麻烦,如果设置了内容类型编码,这也是多余的 – BalusC 2010-01-05 15:27:54

+0

我不认为acceptCharset也是必需的。是非常简单的(也许要感谢facelets),并且需要的东西很少。 – Bozho 2010-01-05 15:34:24

+0

当你想允许页面的内容类型编码无法处理的形式的字符时,这并不是多余的。是的,最好是改变该内容类型编码,如果只是为了解决MSIE bug问题,但我的意思是,这更像是一种缩小错误的方法,而不是一种修复方法。 – 2010-01-05 15:36:40

-2

你需要转换为Unicode在您的服务器端,例如,如果你使用的是GlassFish添加参数编码默认字符集=“UTF-8”进入Glassfish的-web.xml中。为我工作。

<parameter-encoding default-charset="UTF-8" />