当我从网页提交角色Ö后,后端收到了Ã。该网页是Spring Webflow / JSF1.2 / Facelets应用程序的一部分。当我用firebug检查POST时,我看到:
Content-Type: application/x-www-form-urlencoded
Content-Length: 74
rapport=krediet_aanvragen&fw1=0&fw2=%C3%96ZTEKIN&fw3=0&fw4=0&zoeken=Zoeken
字符Ö编码为%C3%96,使用this表我可以看到它是UTF-8 / Unicode字符Ö的正确十六进制表示。 但是当它到达后端时,角色会变成Ã。使用相同的表我可以看到有些代码试图分别解释C3和96(或作为unicode \ u表示法)。 U + 00C3恰好是Ã,96不是可见字符,因此可以解释这一点。
现在我知道这是编码不匹配的典型情况,我只是不知道在哪里修复此问题。
网页包含
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
调试时我可以看到负责错误interpration的库是jboss-el 2.0.0.GA,这似乎是正确的,因为该值在webflow表达式中被解析为后端:
<evaluate expression="rapportCriteria.addParameter('fw2', flowScope.fw2)" />
通过以下方式将其放在flowScope上:
<evaluate expression="requestParameters.fw2" result="flowScope.fw2"/>
没关系将表单输入到后端的精确方法,这是尝试将Webflow与BIRT报告集成的代码......但我在其他Web应用程序中使用了相同的sympton。
知道我必须开始寻找吗?
答案 0 :(得分:6)
我可以看到它是UTF-8 / Unicode字符Ö的正确十六进制表示。但是当它到达后端时,角色会变成Ã。
因此,对POST主体进行编码的客户端字符编码是正确的,但服务器端字符编码不能解码POST主体。您需要创建一个Filter
,它基本上在doFilter()
方法
request.setCharacterEncoding("UTF-8");
并将其映射到感兴趣的URL模式。 Spring也提供了一个开箱即用的CharacterEncodingFilter
,基本上就是上面提到的。您需要做的就是将其添加到web.xml
:
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
HTML元标题在问题上与此无关,在通过HTTP提供页面时会忽略它。它是HTTP响应头,它指示webbrowser在什么字符集中显示响应和以将params发送回服务器。由于POST正文已正确编码,因此显然已经正确设置了这一点。仅当用户将页面保存到本地磁盘并稍后从本地磁盘重新访问时,才会使用HTML元标题。