我在我的一个JSF(这是一个facelet)中遇到了一个奇怪的问题。我正在使用Richfaces,在一个页面上我得到了一个正常的表格
<h:form></h:form>
我的问题是,当我提交表格时,所有UTF-8字符 - 就像德语变音符号(äöü)一样 - 都是加密的。如果我在浏览器上将页面更改为ISO-8859-1,则可以正常工作。
如果我使用属性
展开表单<h:form id="register-form" acceptcharset="ISO-8859-1">
它也有效。 (仅适用于德语变音符号) - 其他UTF-8字符将被加密为不可读的内容。
有人可以帮我这个吗?
答案 0 :(得分:1)
您需要按HttpServletRequest#setCharacterEncoding()
设置POST
请求编码。最佳位置是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 ..浏览前面提到的链接的解决方案部分如何使它们正确。
答案 1 :(得分:0)
这是正确的行为。 UTF-8意味着你想要Unicode字符(即非ASCII或任何&gt; = charpoint 128)必须用两个字节编码。
但是您的JSF框架应该在您的代码可以看到之前将数据解码为Unicode字符串。所以我的猜测是你没有指定页面或表单的编码,因此,你的框架只能猜测它得到了什么。始终将acceptcharset
设置为utf-8
,将整个HTML页面的编码设置为相同(使用meta
标记)。
然后它应该工作。
答案 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标头和表单请求,以查看正在使用的编码。然后你应该能够找出出错的地方。