9

我正在尝试提交一个表单,其中包含 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:当我将表单更改为获取而不是发布时,一切正常。我不知道什么帖子被打破了。

4

3 回答 3

11

看起来浏览器不会将字符集作为请求标头中 Content-Type 的一部分发送(即使设置了表单上的接受字符集),并且 Tomcat 会处理诸如 Latin-1 (http://wiki.apache. org/tomcat/FAQ/CharacterEncoding#Q1)。

因此,稍后这可能已被解码为 Latin-1 并编码为 UTF-8,从而导致字符乱码。

将 CharacterEncodingFilter 移到顶部并强制将编码设置为 UTF-8 解决了该问题。

于 2013-04-17T16:05:57.390 回答
4

您的 web.xml 中是否有用于 EncodingFilter 的过滤器映射条目?

<filter-mapping>
  <filter-name>EncodingFilter</filter-name>
  <url-pattern>*</url-pattern>
</filter-mapping>
于 2013-04-16T15:18:17.377 回答
1

我建议您删除 CharacterEncodingFilter,这本身可能是双重编码的原因。

要调试情况,您应该首先检查浏览器是否正确发布数据。在 Chrome (F12) 上使用 Firebug(用于 Firefox)或开发者工具

很可能,问题出在服务器端。您使用哪个服务器?如果使用 Tomcat,则需要在 server.xml 中的 Connector 元素上将 CharsetEncoding 设置为 UTF-8

更新1:

问题很可能是您正在设置的 forceEncoding 。根据文档

如果请求尚未指定编码,则此过滤器可以应用其编码,或者在任何情况下强制执行此过滤器的编码 ("forceEncoding"="true")

当您执行 get 时,没有指定编码,因此它可以工作是有道理的。

但是,当您执行 POST 时,编码已经应用,然后(似乎)再次应用,因为 forceEncoding=true

于 2013-04-16T10:10:52.570 回答