複数の文字コードに対応する。

 普通、文字コードの変換はフィルターで行います。
 サンプルは doFilter setCharacterEncoding でぐぐると出てきます。
 が。
 ところが、問題が出てきました。
 今回、文字コードShift_JISに統一しています。 UTF-8 だと IE じゃ画面が崩れちゃうんで。なので、フィルタのエンコードShift_JIS にしてあります。
 ところが、上記の「パラメーターに付加した文字コード」は UTF-8 です。
 これが渡ってくると、 UTF-8文字コードを無理矢理 Shift_JIS に変換されて壊されちゃうんです。
 で……結局、次のように解決しました。

  • RewriteRule にエンコードパラメーターを追加する。
  • doFilter() でそのパラメーターをチェックする。
  • パラメーターがあればそれで、なければ web.xml で設定したものでエンコードする。
  • エンコードは setCharacterEncoding() を使わずにする。

 とゆー感じ。
 まず、エンコード用パラメーターとして encoding=UTF-8 というパラメーターを is_redirect=true の後ろに追加しました。
 これを、 doFilter() で request.getParameter( "encoding" ) して取得します。取得できなければ config.getInitParameter( "encoding" ) したものを使用します。
 で、これを setCharacterEncoding() すればOK……と思いきや、一度 request.getParameter() しちゃうと無理らしいんで、 http://www1.odn.ne.jp/~aaa10090/zaregoto/deb/d050218e.htm のコードを参考に手動で変換するようにしました。これで大丈夫なはず。
 そのコード。

/**
*    フィルタリングします。<BR>
*    文字コードを変換します。<BR>
*/
public void doFilter
    ( ServletRequest request
    , ServletResponse response
    , FilterChain chain 
    )
    throws IOException, ServletException 
{
    // パラメーターにエンコードが指定されていたらそれを使用します。
    String encoding = strEncode_;
    request.setCharacterEncoding( "ISO-8859-1" );
    String thisEncode = request.getParameter( "encoding" );
    if    (
        ( thisEncode != null ) &&
        ( thisEncode.equals( "" ) == false )
        )
    {
        encoding = thisEncode;
    }

    // 手作業でエンコードします。
    // getParameter() すると setCharacterEncoding() が効かないんで。
    Map parameterMap = request.getParameterMap();
    if( parameterMap != null )
    { 
        for( Iterator it = parameterMap.keySet().iterator(); it.hasNext(); ) 
        { 
            String name = (String)it.next(); 
            String[] values = request.getParameterValues( name ); 
            if( values != null ) 
            { 
                for( int i = 0; i < values.length; i++ )
                { 
                    values[i] 
                        = new String( values[i].getBytes( "ISO-8859-1" ), encoding ); 
                } 
            } 
        } 
    } 
    
    chain.doFilter( request, response );
}

 これで、検索条件まわりはうまくいきました。
 ……検索条件まわりわっ!!
 こんだけのことに何時間かかったんだか……文字コードなんて嫌いだ……。