Javaファミリーのキモチが見えてきた

なんとなく毛嫌いしていたJavaですが、最近Javaの思想というのが最近見えてきたような気がします。と言っても、あ〜Javaならこう書けばいいのかとか、あ〜Javaならこう設計するといいな。といった感じですか。まぁ、この世界も奥が深そうなので、まだまだでしょうが。

でもって本題。

ン年ぶりにwebアプリを書いています。

要求仕様などもろもろの事情からJBoss3.2をたてて、その上で日本語を扱うwebアプリを書いているんですが、その中で日本語が正しくハンドルされないという問題点にぶち当たりました。JBossはデフォルトでTomcatを使用してるんで、そのあたりに問題があるんじゃないかと、いろいろ調べてみると どうもrequest.getParameter()で正しく encodeした文字列が取得できてないようです。

getParameter()する前にsetCharacterEncoding()で encodingをUTF-8にしているのでここで正しくStringが生成されそうなものですが、う〜む・・・

ワタシはServletプログラムの経験が薄いので、なかなかgoogle検索のカンどころがつかめず、この件かなり悩みました。Apacheならソースも何度も眺めてるし、perl CGIなら腐るほどプログラムしてるので慣れているんですがねぇ・・・

それでも、いろいろ探したらTomcatのBugzillaで次の記述にぶちあたりました。

http://issues.apache.org/bugzilla/show_bug.cgi?id=23929

まぁようするに、

1)URIにASCII文字列意外の文字があったらw3の規格的にはそれはUTF-8でencodingして、%xxに置き換えて送るというのが正しい。
2)しかし現実のクライアント(ブラウザ等)はそう実装されていないものが多々ある
3)そのため様々な問題が起きている
※いままで、このあたりマッタク気にしたことなかったなぁ〜(笑)

4)そこで、Tomcatでは(デフォルトでは)こう実装されている
- Tomcat4では(規格からは外れているが) Body(すなわち本文)と同じ Encodingを使用していると解釈してURIをdecodeする。
- Tomcat5ではBodyと同じEncodingをしない。デフォルトの Encodingは ISO-8859-1であるので、それでdecodeする。

で、最後にTIPSとして
・こういうことをしたいならPOSTを使えばいい。

ということで、POSTにしたら確かに直りました・・・バンザーイ!!

まぁようするに、Tomcat4ではワタシが思っていたように動作するようになっていたわけで(それは規格として間違っているのだが)、世の中にはTC4ベースの良解説ページが沢山あり、得てしてそういうページは上位にくるので、google検索の誤解スパイラルに陥ってしまっていたようです。

分かってしまえばそれをキーワードに検索すれば、解決法や同じことで悩んでる人がワラワラ出てくること出てくること。例えば、サーバ側の設定で解決する方法としては、以下のようなページがありました。

http://www.atmarkit.co.jp/fjava/rensai3/mojibake03/mojibake03.html

で、Bugzillaのページ見ておもったんですが、Tomcat5もURIパラメータの解釈は結局のところ規格外なんですよね。UTF-8で規格的に正しくエンコードされたURLでもISO8859-1で解釈するんですから。

このあたり、別なservletとの互換性も絡んでいるのでしょうか?なかなかJavaの世界も深いようで・・・