JSPのパラメータをGETで日本語投げた時の文字化け





タイトルで何を言ってるかわからないって?
自分もイマイチわからないよ。
詳しく言うと、

Tomcatサーバを動かしていてサーバサイドJavaJSPにHTML等から日本語(マルチバイト文字)をGETで投げるときに文字化けしてしまう問題


結構はまりました。

http://example.jp/foo.jsp?item=はてな

こんな感じでURL内に日本語を使うとき

GETで日本語を含むマルチバイト文字を送るのはあまりよろしくないが、
そのページをブックマークする可能性があったりするとどうしてもURLに対し一意なページにしたい。
じゃぁ英数字の文字列でもいいじゃん・・・ってなるけど日本語の方が見たときにわかりやすいってのはあると思う。




はじめは何も考えずに下みたいな感じでしてたけど
(※HTML側もJSP側も文字コードUTF-8)

HTML側

<form method="get" action="./foo.jsp">
<input type="text" name="item" value="はてな">
<input type="submit">
</form>

JSP(Java)側

request.setCharacterEncoding("UTF-8");
out.println("item : " + request.getParameter("item");




でも化けちゃうと
なんでだろって思いながらHTMLからJSP(Java)に投げる時にJavascriptUTF-8にURLをエンコードしようってなって、
Javascript

var foo = encodeURIComponent(item);

みたいにエンコードしたけどそれでもだめ
ダメ!ダメ!ダメ!



なんでだろーって思ってたら
Windowsに入れたデフォルトのTomcat(自分の場合Tomcat7.0)
ではどうやら内部処理がISO-8859-1らしい。
なのでJSP(Java)側を

String GetItem = new String (request.getParameter("item").getBytes("ISO-8859-1"));
out.println("ISO-8859-1でエンコード:"URLDecoder.decode(GetItem,"UTF-8"));

という風にISO-8859-1で渡されましたよーってJavaに教えてあげないといけない。


他にも方法があって、
Server.xml(tomcat/7.0/conf/server.xml)に

<Connector port="8080" 
<!--
 * 
 * なんかいっぱい書いてある
 * 
-->
useBodyEncodingForURI="true" />

って

useBodyEncodingForURI="true"

を追記してあげるといい



もしくは

<Connector port="8080" 
<!--
 * 
 * なんかいっぱい書いてある
 * 
-->
URIEncoding="UTF-8" />

ってな感じで

URIEncoding="UTF-8"

を追記してUTF-8で処理しろーって明示してあげるのもおk!




自分の場合、初めWindowsの環境で作ってて
String GetItem = new String (request.getParameter("item").getBytes("ISO-8859-1"));
out.println("ISO-8859-1でエンコード:"URLDecoder.decode(GetItem,"UTF-8"));
で文字化け問題解消してたんだけども、
実際のLinuxサーバ(Ubuntu12.04)にデプロイした時に文字化けが再発してて、
なぜだっ!!!!って思ったらUbuntuに入れたTomcatは最初からServer.xml
URIEncoding="UTF-8"
が書かれてて踏んだり蹴ったりって感じ。
解決した今ではOSでの違いっていうのもおもしろいよね。



以上はてなブログスーパーpre記法使って書いてみたかっただけのブログでしたー