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

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

[山田祥寛,@IT]

 「サーブレット2.3における文字エンコーディングの指定」でも説明したように、JSP&サーブレットではリクエストデータに2バイト文字が含まれている場合に、デフォルトではこれを正しく扱うことができません。

 そこで、サーブレット2.3以降対応のコンテナではHttpServletRequest#setCharacterEncodingメソッドを用いてリクエストデータにおける文字コードを明示的に宣言する必要があるわけですが、残念ながらこの方法、サーブレット2.2以前の環境では使用することができません。サーブレット2.2では、少々面倒ではありますが、自ら文字エンコーディングを変換するユーザー定義メソッドを用意する必要があります。

解説

 リクエストデータの文字コードを変換するユーザ定義メソッドは、以下のように記述します。

public static String transferEncoding(String strVal)
  throws UnsupportedEncodingException {
  if(strVal==null){
    return (null);
  }else{
    return (new String(strVal.getBytes("ISO-8859-1"),"Shift_JIS"));
  }
}

 ユーザー定義メソッドtransferEncoding(名前はもちろん何でも構いません)は、パラメータとして与えられた文字列をいったんISO-8859-1(Latin-1)の文字列としてバイト列に変換し、あらためて(本来の文字コードである)Shift-JISの文字列として再構築します。「Shift-JIS」の部分は「EUC-JP」や「ISO-2022-JP(JIS)」、「JISAutoDetect(自動判定)」とすることも可能です。

 リクエストデータの読み込み側では、transferEncodingメソッドを使用して、以下のように記述するだけです。

<%=transferEncoding(request.getParameter("name")) %>

 なお、ユーザー定義メソッドは各JSP/サーブレット内で記述してももちろん構いませんが、全ページ共通で使用する性質のものであることからも、インクルードファイル、またはクラスとして外部ファイル化しておくことをお薦めします。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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