web-dev-qa-db-ja.com

Spring MVC UTF-8エンコーディング

現時点では、Spring MVCの使用を開始しようとしています。試しているうちに、エンコードの問題に遭遇しました。

JSPページにUTF-8文字を表示したいので、ModelAndViewにUTF-8文字の文字列を追加しました。次のようになります。

@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    @RequestMapping(value="/", method=RequestMethod.GET)
    public ModelAndView home() {
        logger.info("Welcome home!");
        return new ModelAndView("home", "utftest", "ölm");
    }

}

JSPページでは、次のようなUTF-8文字を使用して文字列を表示するだけです。

<%@ page language="Java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib uri="http://Java.Sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Home</title>
</head>
<body>
    <h1>Hello world!</h1>
    <p><c:out value="ö" /></p>
    <p><c:out value="${utftest}"></c:out></p>
</body>
</html>

その結果、私は次のようになります:

Hello world!

ö

ölm

次のコード<c:out value="ö" />がエンコードエラーなしで表示されたことに注意してください。 Springsource Tool SuiteでデフォルトのエンコーディングをUTF-8に設定しましたが、まだ間違った文字が表示されています。

編集:

たぶん、OS X 10.6を搭載したMacを使用していることに言及すべきでした。 Spring開発では、SpringのSpringsource Tool Suite(http://www.springsource.com/developer/sts)を使用します。これが私の設定の何が悪いのかを見つけるのに役立つことを願っています。

編集2:

McDwellのおかげで、コントローラーで"\u00f6lm"の代わりに"ölm"を使用してみましたが、JSPページのエンコードの問題はなくなりました。

それは、私の.Javaファイルが間違った文字セットでエンコードされているということですか? Eclipseのどこでこれを変更できますか?

ありがとうございました。

59
OemerA

エンコーディングの問題の理由を見つけました。

障害はビルドプロセスにありました。 pom.xmlファイルでMavenにUTF-8エンコーディングでプロジェクトをビルドするように指示しませんでした。そのため、Mavenは私のシステムであるMacRomanからデフォルトのエンコードを取得し、MacRomanエンコードでビルドします。

幸いなことに、Mavenはプロジェクトをビルドするときにこれについて警告しています(ただし、他のすべてのメッセージが原因で、画面から警告がすぐに消える可能性があります)。

pom.xmlファイルで設定する必要があるプロパティは次のとおりです。

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    ...
</properties>

すべてのあなたの助けをありがとう。皆さんがいなければ、私はこれを理解することができませんでした!

38
OemerA

必ずweb.xmlにSpringのCharacterEncodingFilterを登録してください(そのファイルの最初のフィルターである必要があります)。

<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>  
<filter-mapping>  
    <filter-name>encodingFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping> 

Tomcatを使用している場合、server.xmlURIEncodingを設定していない可能性があります。 UTF-8に設定しないと機能しません。 CharacterEncodingFilterを確実に保持します。それにもかかわらず、ここに簡潔な チェックリスト が続きます。この作業を行うためのガイドになります。

119

Benjaminの答え(私はスキミングしました)に加えて、ファイルが適切なエンコード(ソースコード、JSPなどの場合はUTF-8になりますが、Javaプロパティファイルは、定義によりISO 8859-1としてエンコードする必要があります。

これに伴う問題は、ファイルの保存に使用されたエンコーディングを特定できないことです。唯一のオプションは、特定のエンコーディングを使用してファイルを開き、コンテンツが適切かどうかを確認することです。また、iconvを使用して、想定されるエンコーディングから目的のエンコーディングにファイルを変換することもできます。エラーが発生する場合、仮定は正しくありません。したがって、hello.jspがUTF-8としてエンコードされていると想定する場合は、「iconv -f UTF-16 -t UTF-8 hello.jsp」を実行してエラーをチェックします。

ファイルが適切にエンコードされていないことがわかった場合は、その理由を調べる必要があります。おそらく、エディターまたはIDEを使用してファイルを作成しました。 Eclipse(およびSTS)の場合、Text File Encoding(Preferences/General/Workspace)がUTF-8に設定されていることを確認してください(残念ながら、デフォルトはシステムのプラットフォームエンコーディングです)。

エンコードの問題をデバッグするのが非常に困難なのは、非常に多くのコンポーネント(テキストエディター、ブラウザ、さらにその間のすべてのソフトウェアコンポーネント、場合によってはデータベースを含む)が関係し、それぞれがエラーを引き起こす可能性があることです。

14
otto.poellath

Benjaminの答えに加えて-Spring Securityを使用している場合、web.xmlにCharacterEncodingFilterを配置することが常に機能するとは限りません。この場合、カスタムフィルターを作成し、最初のフィルターとしてフィルターチェーンに追加する必要があります。チェーンの最初のフィルターであることを確認するには、WebSecurityConfigurerAdapterでaddFilterBeforeを使用して、ChannelProcessingFilterの前に追加する必要があります。

@Configuration
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter {


    @Override
    protected void configure(HttpSecurity http) throws Exception {

        //add your custom encoding filter as the first filter in the chain
        http.addFilterBefore(new EncodingFilter(), ChannelProcessingFilter.class);

        http.authorizeRequests()
            .and()
            // your code here ...
    }
}

Spring Securityのすべてのフィルターの順序は、ここで入手できます。 HttpSecurityBuilder-addFilter()

カスタムUTF-8エンコードフィルターは次のようになります。

public class EncodingFilter extends GenericFilterBean {

    @Override
    public void doFilter(
            ServletRequest request, 
            ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");

        chain.doFilter(request, response);
    }
}

Jspファイルを追加することを忘れないでください:

<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>

また、web.xmlからCharacterEncodingFilterがある場合は削除します。

9
Alexey

Stringを返すSpring MVCでUTF-8エンコードを強制する最も簡単なソリューション:

@RequestMappingで、次を使用します。

produces = MediaType.APPLICATION_JSON_VALUE + "; charset=utf-8"
6
Alex R

controller.Javaを右クリックしてからプロパティを設定し、テキストファイルがutf-8でエンコードされているかどうかを確認します。エンコードされていない場合はこれが間違いです。

4
storm_buster

この問題を解決するには、次の3つの手順が必要です。

  1. 以下のように、ページエンコーディングをUTF-8に設定します。

    <%@ page language="Java" pageEncoding="UTF-8"%>
    <%@ page contentType="text/html;charset=UTF-8" %>
    
  2. Web.xmlファイルで以下のようにフィルターを設定します。

    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
  3. JavaコードまたはJSPでUTF-8文字を直接記述する場合は、リソースエンコーディングをUTF-8に設定します。

4
user7373275

ビューのレンダリング方法に応じて、次のものも必要になる場合があります。

@Bean
public StringHttpMessageConverter stringHttpMessageConverter() {
    return new StringHttpMessageConverter(Charset.forName("UTF-8"));
}
3
Axel Fontaine

私のためにここのように働いた Spring MVC Java config

webイニシャライザーに追加

 @Override
      protected Filter[] getServletFilters() {

        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        return new Filter[] { characterEncodingFilter};
      }
0
d0wn