連載
» 2003年12月02日 10時00分 公開

JavaTips 〜JSP/サーブレット編:サーブレット2.3における文字エンコーディングの指定

[山田祥寛,@IT]

 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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。