2009-05-31 20 views
7

私はいくつかのテキストフィールドを持つHTMLフォームを持っています。JSPでのエンコーディングの問題

英語の文字(私の場合はロシア語)を提出しようとすると、サーバーは「読むことができない」文字列(質問ではなく「奇妙な文字」)を受け取ります。

私はここでそれを表示するために私のコードを簡素化:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ page contentType="text/html;charset=UTF-8" language="java" %> 
<html> 
    <head><title>Simple jsp page</title></head> 
    <body> 
    <c:out value="${param.rustext}"/> 
    <form action="/test" method="post"> 
     <input type="text" name="rustext" width="30"> 
     <input type="submit" value="Submit"> 
    </form> 
    </body> 
</html> 

私はそれをどのように修正する必要がありますか?

+2

をweb.xmlに次のフィルタを追加しますが、実際のエンコーディングとしてUTF-8を送信して、あなたのページのヘッダーはありますか? Fiddlerのようなもので確認してください –

+0

そして、そうでない場合はどうしたらいいですか? – Roman

答えて

8

Tomcatは、URLを含むページのエンコーディングに関係なく、URLパラメータのデフォルトの文字エンコーディングとしてISO-8859-1を使用します。これは"URIEncoding" attribute in its Connectorの設定で変更できます。他のアプリケーションサーバーでも同様の設定が可能です。

This articleは、JSPで作業するときによく遭遇する多くの問題をカバーします。

+0

はい、Tomcatを使用しています。リンクをありがとう、私はそこに有用な何かを見つけることを試みる。 – Roman

+0

URIEncoding属性の詳細については、http://tomcat.apache.org/tomcat-5.5-doc/config/http.htmlを参照してください。 – erickson

+1

この回答は*実際には間違っています。 OPはGETではなくPOSTを使用していました。 – BalusC

0

必須のエンコーディングであるPOSTを使用する場合、フォームはcontent-type "application/x-www-form-urlencoded"として送信されます。あなたはあなたのエンコーディングを指定するために、form-attribute accept-charset = "UTF-8"を指定することができます。

+0

私はすでに試してみましたが、うまくいきません。 – Roman

3

エリクソンはこれをこのページで非常にうまく説明しました。サーバーに依存しないソリューションは、文字エンコーディングフィルタ(org.springframework.web.filter.CharacterEncodingFilter)を使用することです。フィルター宣言と適切なセクションのフィルタURLマッピングを追加し、web.xmlで

import java.io.IOException; 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 

public class EncodingFilter implements Filter { 
    private String encoding = "utf-8"; 
    public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain filterChain) throws IOException, ServletException { 
     request.setCharacterEncoding(encoding); 
     filterChain.doFilter(request, response); 
    } 
    public void init(FilterConfig filterConfig) throws ServletException { 
     String encodingParam = filterConfig.getInitParameter("encoding"); 
     if (encodingParam != null) { 
      encoding = encodingParam; 
     } 
    } 
    public void destroy() { 
     // nothing todo 
    } 
} 

:以下の例を参照してください

<filter> 
    <filter-name>EncodingFilter</filter-name> 
    <description> 
    <![CDATA[Changes the encoding of the request, in order to help the appserver to correctly interpret request params]]> 
    </description> 
    <filter-class>com.mypackage.EncodingFilter</filter-class> 
<init-param> 
    <param-name>encoding</param-name> 
    <param-value>ISO-8859-15</param-value> 
    </init-param> 
</filter> 


    <filter-mapping> 
     <filter-name>EncodingFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
+0

これは、要求の本文であり、要求のURLではありません。言い換えれば、これはGETリクエストではなく、POSTリクエストのエンコーディングを設定します。 GETリクエストの場合、まだエリクソンの答えに記載されているように、サーブレットコンテナの設定を試す必要があります。 – BalusC

+0

そうですね、URLについては考えていません。 –

0

これはビクターイオネスクが提案されているものと同じですが、あなたはしないでください独自のエンコーディングフィルタを作成する必要があります。

<filter> 
    <filter-name>charsetFilter</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> 
</filter> 

<filter-mapping> 
    <filter-name>charsetFilter</filter-name> 
    <url-pattern>*.admin</url-pattern> 
</filter-mapping>