複数の文字コードに対応する。
普通、文字コードの変換はフィルターで行います。
サンプルは 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 ); }
これで、検索条件まわりはうまくいきました。
……検索条件まわりわっ!!
こんだけのことに何時間かかったんだか……文字コードなんて嫌いだ……。