具有表单发布和Spring Controller的UTF-8编码


问题内容

我正在尝试提交一个表单,其中包含UTF8字符。该表格如下所示:

<form id="workflowPersistForm" accept-charset="UTF-8" method="post" action="/workflow-next">>
  <input id="stateGlobal" type="hidden" value=" お問い合わせ" name="state">
</form>

我的服务器是基于spring的。我的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时,一切正常。我不知道哪个帖子坏了。


问题答案:

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

因此,稍后可能会将其解码为Latin-1,并将其编码为UTF-8,从而导致字符混乱。

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