JSP&サーブレットにおいて、リクエストデータに2バイト文字(日本語など)が含まれている場合には、必ず文字エンコーディングの指定を行う必要があります。
というのも、Javaはデフォルトで内部処理をUnicodeベースで行なうのに対して、クライアントから送信されるリクエストデータは(一般的に)Shift-JISやEUC-JPのような文字コードです(HTMLデータと同じ文字エンコーディング)。このとき、多くのJSP&サーブレットコンテナは自動で文字コードの変換は行わないため、文字コードの不整合が発生し、文字化けの原因となるわけです。
そこで、リクエストデータに2バイト文字が含まれている可能性がある場合には、あらかじめ「リクエストデータで使用されている文字コード」を宣言する必要があります。
解説
サーブレット2.3以降においては、HttpServletRequest#setCharacterEncodingメソッドを利用することが可能です。すべてのリクエストデータを読み出す前に、以下の一文を記述してください。
request.setCharacterEncoding("EUC-JP");
「EUC-JP」の部分は、想定される文字エンコーディングに応じて「SJIS」や「ISO2022JP(JIS)」などに変更してください。また、ブラウザによっては送信してくる文字エンコーディングをあらかじめ特定できない場合もあります。その場合には、自動判定を表す「JISAutoDetect」を指定することもできます。
ただし、なんでもかんでもJISAutoDetectにすればよいというものではありません。リクエストデータの内容によっては文字コードの検出に際して、コンテナが誤認識することもありますので、注意してください。JISAutoDetect指定でリクエストデータの文字化けが解消しないという場合には、想定される文字コードを明示的に宣言するとよいでしょう。
また、setCharacterEncodingメソッドはサーブレット仕様2.3(Tomcatならばバージョン4.x)から導入された比較的新しいメソッドです。サーブレット仕様2.2以前(Tomcatならば3.x以前)の環境では使用することができませんので、注意してください。サーブレット2.2以前の対応については「サーブレット2.2における文字エンコーディングの指定」で説明します。
Copyright © ITmedia, Inc. All Rights Reserved.