JSPエンコーディングでの文字化け
先日の日記でJSPが文字化けする妙なバグがあるらしいということで、色々と調査をしてみた。
[Java][調査済み][文字化け]不思議な現象
<%@page contentType = "text/html; charset =Shift_JIS"%> <%request.setCharacterEncoding("JISAutoDetect");%> <HTML> <BODY> <% String q1 = request.getParameter("q1"); out.println(q1); %> </BODY> <HTML>
上記プログラムでパラメータを受け取ろうとするとrequestが文字化けする。原因は、先頭行のcharasetの後ろに1文字分の空白を入れたことでした。ちなみに、Shift_JISの前に空白を入れた場合、本来なら「サポートされていないエンコーディングです」とメッセージが出力されてコンパイルできないところが、charsetの後ろに空白を入れていると、それを検出してくれずにコンパイルできて、requestの文字化けを引き起こしてしまう。
この問題が根深い点は、request以外のデータが文字化けしていないようなので(色々と未確認)、
<%request.setCharacterEncoding("JISAutoDetect");%>
の行が書かれていない場合に、requestデータすらHTML表示が文字化けしないということに尽きる。おかげで、このバグに遭遇した当初、セッションを遷移先ページで表示すると文字化けしていて、上記のようなページでrequestを受け取りセッションをセットしていたページは一切文字化けしていなかったがために非常に苦労しました。問題がどこにあるか分からなくなったのですよ。セッションが文字化けしているので、セッションを表示しているページがおかしいと疑ってしまったんですが、実際には、セッションをセットしているページがおかしかったという・・・
しかし、これらは全てInternet Explorer上でおきた問題なので、FireFox等では発生しないかもしれません。いずれにせよ、さらに調査が必要になる深刻な問題であるでしょう。
余談:僕のプログラムでなかったことも、問題発見が遅れた大きな原因だったりします。人のプログラムを見るのは体力がいると痛感しました。もっともっと経験が必要だと痛感です。