2012年5月7日月曜日

日本語を扱うときの留意点(パラメータ取得時)にはどんなものがありますか?

 Javaでは、外部から入力された文字列を扱う際には、常にプラットフォームごとに設定されているデフォルトのエンコーディングを使って、Unicodeへの変換を行います。例えば、Windows では SJIS ですし、LinuxやSolaris では EUCと見なして、変換を行うようになっています。サーブレットの場合も同様で、特に指定しなければ、サーブレットに与えられたパラメータの内容も、デフォルトのエンコーディングと見なして変換しようとします。

 ところが、ブラウザから送信される文字列(フォームに入力されたパラメータなど)が、どのエンコーディングで送信されるかは、ブラウザ側の設定や状態によって異なります(1回の起動中に変わることもある)から、常に同じエンコーディングで変換しようとしても、うまく変換されない場合が生じてきます。

 そのため、サーブレットでブラウザからの送信文字列を受信する際には、そのエンコーディングを自動判別して、Unicodeへの変換を行う必要があります。そのために、以下のような方法で変換を行います。

String noencode = request.getParameter("PARAM1");
String encoded = new String(noencode.getBytes("8859_1"),"JISAutoDetect");

 まず、2行目の noencode.getBytes("8859_1") によって、入力された文字列を加工したり変換したりすることなく、そのままバイト配列に置き換えています。つまりパラメータがSJISコードで送信されてきた場合はSJISコードのまま、EUCコードで送信されてきた場合はEUCコードのままでバイト配列に置き換えるわけです。

 さらに、2行目ではStringクラスのコンストラクタ String(byte[],String)によって、そこに指定されるエンコーディングを用いてバイト配列をUnicodeに変換しています。このとき、エンコーディングに「JISAutoDetect」を指定することによって、エンコーディングを自動判別することができます。ですから、ブラウザの設定や状態によってパラメータ文字列のエンコーディングが変わっても、正しくUnicodeへの変換を行うことができます。

0 件のコメント:

コメントを投稿