GETメソッドでの日本語処理でゴタゴタしてたところの整理。 結局バグではなく、環境の違いで混乱しただけの模様^^;
HTMLフォームからGETメソッド日本語を送信した場合、
・ブラウザはヘッダーに文字コード情報はつけ(られ)ない
・Tomcatは、URLデコードしてISO-8859-1固定で渡される
<request.getCharacterEncoding() がたぶん null>
・なので処理する文字コードにプログラムで変換する
これは常套手段となっています。当然URIだけでは文字コードが判別できないので間違っていないと言えます。
しかし、このブログもそうですが、URLにクエリパラメータが入るのを嫌って「/」だけのシンプルなURLから「?param1=xxxx¶m2=yyyy」にフィルタを使って変換してフォワードするわけです。
例(Pebbleまんまです)
URL:/tags/%E5%9C%B0
フォワード:/search.action?query=tag:%E5%9C%B0
この際にTomcatはヘッダに文字コード情報をくっつけてフォワードするため、次に受け取った際にはTomcat(HttpServletRequest)が変換してUTF-8などになって渡されるくることがあるわけです。ただしTomcat単体で動作させている場合です。
<request.getCharacterEncoding() が "UTF-8">
これ(UTF-8)をISO-8859-1だと思って取り出すと文字化けが発生します。
例:new String(query.getBytes("8859_1"), "UTF-8");
これはqueryがUTF-8なら当然ダメですね。
※ここでTomcatが文字コードをつけて・・・と書きましたが実際はフィルタ内のプログラムでフォワードする際にセットしているのです。
request.setCharacterEncoding("UTF-8とか"); これをしないと他に問題がでそうで、取るに取れない。。
次に、ApacheをJKコネクタなどで接続した環境でフォワードすると、処理するのはApacheとなり、ここでデフォルトの文字セット(ISO-8859-1)に変換されてしまうようです。
<request.getCharacterEncoding() が null か ISO-8859-1>
Pebbleのタグは上記のフィルタで処理されています。
そして今回、開発環境はTomcat単体でテストしていたため、わけがわからなくてTomcatのバージョンを疑ったりと、かなり遠回りをしてしまいました。
|