:Tomcat 5の文字化けし問題を徹底的に解決するように教えます


http://tech.ccidnet.com/art/3539/20071205/1298139_1.html
tomcatを使用する場合、皆さんが中国語の文字化けしの問題に遭遇したと信じています.具体的には、フォームで取得した中国語のデータが文字化けして表現されています.
次は私が解決する道です.
一、初級解決方法
検索後、取得文字列をiso 8859−1で復号変換し、gb 2312で符号化し、正しい内容を得る方法が多く採用されている.サンプルコードは次のとおりです.
String  para = new String( request.getParameter("para").getBytes("iso8859-1"), "gb2312");

具体的には、米国人がtomcatを書く際にiso 8859-1をデフォルトで使用して符号化したためだ.
しかし,我々のservletやjspページには大量のパラメータが伝達される必要があり,このように変換すると大量の変換コードをもたらし,非常に不便である.
二、入門レベルの解決方法
その後、クライアントから渡されたパラメータを取得する前に、フィルタによって取得したパラメータ符号化をgb 2312に設定し、getParameterを直接使用して正しいパラメータを取得するフィルタを書き始めました.このフィルタはtomcatのサンプルコードにあります
jsp-examplesには詳細な使用例があります.   ここで、フィルタのweb.xmlでの設定は以下の通りであり、例では日本語の符号化を用いているが、gb 2312に変更すればよい

    < filter>
        < filter-name>Set Character Encoding< /filter-name>
        < filter-class>filters.SetCharacterEncodingFilter< /filter-class>
        < init-param>
            < param-name>encoding< /param-name>
             param-value>EUC_JP< /param-value>
        < /init-param>
    < /filter>

フィルタのコードは次のとおりです.
public class SetCharacterEncodingFilter implements Filter {

    //       
    protected String encoding = null;

   //       
    protected FilterConfig filterConfig = null;

   //           
    protected boolean ignore = true;

   //      
    public void destroy() {

        this.encoding = null;
        this.filterConfig = null;

    }

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

        //        ,        ,             
        if (ignore || (request.getCharacterEncoding() == null)) {
            String encoding = selectEncoding(request);
            if (encoding != null)
                request.setCharacterEncoding(encoding);
        }

        //          
        chain.doFilter(request, response);

    }


    //       
    public void init(FilterConfig filterConfig) throws ServletException {

        this.filterConfig = filterConfig;
        this.encoding = filterConfig.getInitParameter("encoding");
        String value = filterConfig.getInitParameter("ignore");
        if (value == null)
            this.ignore = true;
        else if (value.equalsIgnoreCase("true"))
            this.ignore = true;
        else if (value.equalsIgnoreCase("yes"))
            this.ignore = true;
        else
            this.ignore = false;

    }

    //           
    protected String selectEncoding(ServletRequest request) {

        return (this.encoding);

    }
}

しかしtomcat 5では、フィルタを使用しても文字化けしてしまう可能性がありますが、なぜでしょうか.
三、高度な解決方法
これは、tomcat 4とtomcat 5ではパラメータの処理が異なり、tomcat 4ではgetとpostの符号化が同じであるため、フィルタでrequest.setCharacterEncodingで一度設定すればgetとpostの問題を解決できるからである.しかしながらtomcat 5ではgetとpostの処理は別々に行われる
tomcat 5では、符号化の問題を解決するために、tomcatの著者らは、tomcatのプロファイルserver.xmlにコネクタ要素に次のような構成パラメータを追加し、符号化を直接構成するために特化した多くの努力を行った.
URIEncoding   URIを介して伝達されるコンテンツの使用を設定するための符号化であり、tomcatはここで指定した符号化を用いてクライアントが伝送するコンテンツを符号化する.
URIとは?
JAva docの説明では、URIは統合リソース識別子であり、URLは統合リソースロケータである.したがって,要約すると,各URLはURIであるが,必ずしも各URIがURLであるとは限らない.これは、URIには、リソースの名前が付けられているが、リソースの位置付け方法が指定されていない統合リソース名(URN)というサブクラスも含まれているためです.
すなわち、getメソッドでコミットされたパラメータは、実際にはuriによってコミットされ、このパラメータによって管理され、このパラメータが設定されていない場合、tomcatはデフォルトのiso 8859-1を使用してクライアントのコンテンツを符号化します.
useBodyEncodingForURIはBodyと同じ符号化を用いてURIを処理する.この設定はtomcat 4と互換性を保つためであり、元々tomcat 4とtomcat 5ではキューパラメータの処理が異なり、tomcat 4でgetはpostの符号化と同じである.したがって、フィルタにrequest.setCharacterEncodingで一度設定すればgetとpostの問題を解決できます.しかしながらtomcat 5ではgetとpostの処理は別々に行われ、getの処理は前のURIEncodingで行われ、postの内容はrequest.setCharacterEncodingで処理され、互換性を保つためにこの設定がなされている.
useBodyEncodingForURIを真に設定すると、request.setCharacterEncodingでgetとpostの文字化けし問題を直接解決できます.
これにより,server.xmlにURIEncodingを設定することでgetメソッドにおけるパラメータ問題を解決し,フィルタを用いてpostメソッドにおける問題を解決できる.
あるいはserver.xmlにuseBodyEncodingForURIをtrueに設定することにより、フィルタに合わせて符号化の問題を解決することもできる.
ここでは、ウェブサイトの創作過程でutf-8符号化を使用して文字化問題を徹底的に解決することを強くお勧めします.
具体的な操作は以下の通りです.
1、ページ内容はutf-8形式で保存し、ページに加える
< mete http-equiv="contentType" content="text/html;charst=utf-8">

2、サーバー側のserver.xmlで設定
useBodyEncodingForURI = true

3、フィルタを使用して、フィルタ設定符号化utf-8