0

SpringMVC3.1.1で構築されたTomcatWebアプリケーションのエンコーディングの問題に頭を悩ませてきました。

問題

Freemarker Springマクロを介してSpringによってバインドされたフォーム入力フィールド値は、UTF-8ではなくISO-8859-1としてデコードされます。

現在の構成

すべてをUTF-8でエンコードするようにfreemarkerを構成しました。

    <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エンコーディングは、以下の入力などのフォーム値にバインドされているデータを除いて、フリーマーカービューに戻ってくるデータを表示するのに最適です。

<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

何時間も机に頭をぶつけた後、私はついに問題が何であるかを理解したと思います。上記の設定はすべて正しかった(TomcatコネクタプロパティURIEncode = "UTF-8"を含む)。

フォーム送信を介してGETリクエストのエンコードを処理していたのはSpringMVCであると誤解しました。

ただし、これは実際にはフォームのマークアップの問題にすぎませんでした。フォームの文字セットをUTF-8として指定する必要がありました。

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

これは、上記の構成と組み合わせて、私の問題を解決しました。

于 2012-05-10T15:20:46.207 に答える
1

指定する必要がありました

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

UTF-8文字をバックエンドに正しく送信するため。

于 2012-05-15T20:45:50.530 に答える