我正在尝试提交一个表单,其中包含UTF8字符。 表格如下:
<form id="workflowPersistForm" accept-charset="UTF-8" method="post" action="/workflow-next">>
<input id="stateGlobal" type="hidden" value=" お問い合わせ" name="state">
</form>
我的服务器是基于弹簧的。我的web.xml已经有编码过滤器:
<filter>
<filter-name>EncodingFilter</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>
问题是UTF-8字符在某个地方搞砸了。我在控制器的开始处设置了一个断点,并且字符在这一点上被弄乱了。此外,如果我在Controller中生成UTF8字符,它将在浏览器中正确呈现。就在表格帖子上,控制器没有正确接收字符。
知道我可能做错了吗?
编辑:看起来,在新页面数据中没有弄乱,但是它是双重编码的。 我无法理解为什么它是双重编码的。
编辑2:当我将表单更改为get而不是post时,一切都完美无缺。我不知道哪个帖子坏了。
答案 0 :(得分:11)
看起来浏览器不会将charset作为Content-Type的一部分发送到请求标头中(即使设置了表单上的accept-charset),Tomcat也会处理像Latin-1这样的请求(http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q1 )。
因此,稍后可能会将其解码为Latin-1并编码为UTF-8,从而导致字符出现乱码。
将CharacterEncodingFilter移到顶部并强制将编码设置为UTF-8解决了这个问题。
答案 1 :(得分:4)
您的web.xml中是否有针对EncodingFilter的过滤器映射条目?
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
答案 2 :(得分:1)
我建议您删除CharacterEncodingFilter,它本身可能是双重编码的原因。
要调试参数,首先应检查浏览器是否正确发布数据。在Chrome(F12)上使用Firebug(适用于Firefox)或开发人员工具
最有可能的问题出在服务器端。你用哪个服务器?如果使用Tomcat,则需要在server.xml的Connector元素上将CharsetEncoding设置为UTF-8
更新1:
问题很可能是您正在设置的forceEncoding。根据{{3}}
如果请求没有,则此过滤器可以应用其编码 已指定编码,或在任何编码中强制执行此过滤器的编码 case(“forceEncoding”=“true”)
当你做get时,没有指定编码,所以它有效。
然而,当您执行POST时,编码已经应用,然后(似乎)因为forceEncoding = true而再次应用