0

我一直在为使用 Spring MVC 3.1.1 构建的 Tomcat Web 应用程序的编码问题而摸不着头脑。

问题

Spring 通过 Freemarker Spring 宏绑定的表单输入字段值被解码为 ISO-8859-1 而不是 UTF-8。

当前配置

我已将 freemarker 配置为以 UTF-8 编码所有内容。

    <bean id="freemarkerConfig"
       class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
       <property name="templateLoaderPath" value="/WEB-INF/templates/" />
       <property name="freemarkerSettings">
          <props>
            <prop key="auto_import">spring.ftl as spring</prop>
            <prop key="url_escaping_charset">UTF-8</prop>
          </props>
       </property>
    </bean>

这是我在 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 标记头标签包含:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

UTF-8 编码非常适合显示在我的 freemarker 视图中返回的数据,但绑定到表单值的数据除外,例如下面的输入。

<form id="main-search-form" action="search" method="GET">
   <@spring.formInput 'searchForm.q' 'id="q" maxlength="2048" autocomplete="off" spellcheck="false"'/>
</form>

据我所知,在互联网上阅读了数小时后,在大多数情况下,Spring 似乎默认为 ISO-8859-1,但我还没有找到一个可以覆盖的 bean 来更改绑定数据的解码类型. 即使 HTTP 请求使用 UTF-8 编码并且 tomcat 容器的连接器节点设置为 URIEncode="UTF-8",Spring 也会尝试使用 ISO-8859-1 进行解码。

任何帮助,将不胜感激。

4

2 回答 2

1

我需要指定

  <form ... accept-charset="UTF-8"> ...

让我的 UTF-8 字符正确提交到后端。

于 2012-05-15T20:45:50.530 回答
1

在我的头在桌子上敲了几个小时之后,我想我终于弄清楚了问题所在。我上面的配置都是正确的(包括 Tomcat 连接器属性URIEncode="UTF-8")。

我错误地假设是 Spring MVC 通过表单提交处理我的 GET 请求的编码。

但是,这实际上只是表单标记的问题。我需要将表单字符集指定为 UTF-8。

<form id="main-search-form" action="search" method="GET" accept-charset="UTF-8"> 
   ...
</form>

这与上述配置相结合,解决了我的问题。

于 2012-05-10T15:20:46.207 回答