javax.servlet.ServletRequest#getParameter

getParameterメソッド症状javax.servlet.ServletRequestクラスのgetParameterメソッドを使用して,日本語の値を取得しようとすると,文字が化けることがあります. これは,URLエンコードして渡されたパラメタの中身をISO-8859-1だと誤解してURLデコードしてしまうためです.ただし,化けるかどうかは,使用しているServletコンテナに依存していて, たとえば,Apache JServやJakarta Tomcatは化けますが,IBMのWebSphereは化けないなどの違いが出てきます. しかし,化けない場合でも,潜在的な問題があるアドホックな実装であることが多いようです.解決策化ける場合には,以下のようなコードで,一度オリジナルのバイト列に逆変換してから,正しい文字エンコーディングを指定して,Unicodeに変換するようにします.
例:

    if ( (s = req.getParameter("s") ) != null) {
       try {
	   s = new String(s.getBytes("iso-8859-1"), "Shift_JIS");
       } catch (UnsupportedEncodingException e) {
         // エラー処理を記述する
       }
    }

恥ずかしい話ですが、結構JSP/Servletの開発をやってたつもりですが全く知りませんでした。自分が情けない。

ServletFilterを作っていたんですが、パラメータがなぜかが文字化けするので悩みまくってました。Filter関係でおかしくなったと思ってて、まさかgetParameterメソッドがそんなんだったなんて思わなかったんで、上のページを見たときも全然気にしませんでした。自分でひたすら探ること丸二日。僕馬鹿です。ちゃんと調べろよ。
何回もFilter作ってたんだけどなー。あ、あんときはWebShereだったっけ。

補足

上のやり方じゃなくてHttpServletRequestのsetCharacterEncodingメソッドに指定するだけでよいのね。理由も多言語対応ってことで納得。そりゃそうだって感じです。うーん、なんで今まで知らんかったんでしょう?

setCharacterEncoding