外国語フォームの送信処理

Web サイトは、世界中のあらゆるブラウザからアクセスされます。クライアントはフォームを送信するとき、ブラウザで設定されたエンコードタイプで送信フォームをエンコードします。結果として、すべてのフォームが同じエンコードタイプで送信されるということは当てにできません。Internet Explorer では、[表示] > [エンコード] を選択して、エンコードタイプを表示できます。

このセクションでは、リクエストデータをデコードする次のメソッドを説明します。

リクエストのエンコードタイプの取得

ブラウザで ISO-8859-1 以外の文字セットが使用される場合、リクエストの Content-Type ヘッダーのエンコード文字セットが送信されることを 仮定できます。Content-Type ヘッダーから文字セットを取得するには、request オブジェクトの getCharacterEncoding メソッドを使用します。この値を使用してフォームデータをデコードし、正しい文字セットを使用してレスポンスで作業できます。

たとえば、クライアントが EUC-JP を使用したフォームを送信し、リクエストの
Content-Type ヘッダーが Shift_JIS に設定されている場合、処理する側のサーブレットは、リクエストがエンコードされた方法やそれを正しくデコードする方法を判断できます。

エンコード対応の String コンストラクタの使用

サーバは、クライアントのブラウザで使用されたエンコードタイプを無視して、デフォルト文字セット ISO-8859-1 ( Latin-1 とも呼ばれます) を使用して、フォームデータをデコードします。EUC-JP 文字セットを使用してフォームが送信された場合、JRun はエンコード文字セットと異なるデフォルトのデコード文字を使用してリクエストデータをデコードすることになるので、リクエストデータは壊れてしまいます。

デコードが正しく行われるように、Java にはエンコードタイプを設定できる次の 2 つの String コンストラクタがあります。

次の例は、文字エンコードタイプと元のフォーム入力の実際のバイト配列を取得して、正しいエンコードタイプで文字列を作成します。

...
String encoding = request.getCharacterEncoding();
String httpDefaultEncoding = "ISO-8859-1";
String corruptData = request.getParameter("name"); //データは、デフォルトで 
ISO-8859-1 を使用してデコードされます。
String correctData = new 
String(corruptData.getBytes(httpDefaultEncoding), encoding);
...

現在ほとんどのブラウザでは、リクエストで使用されているエンコードタイプにかかわらず、HTTP Content-Type リクエストヘッダーは設定されません。結果として、
getCharacterEncoding メソッドを呼び出すと、通常は null 値が返されます。

このタイプの String コンストラクタは、エンコードタイプがサポートされない場合は、UnsupportedEncodingException が返されます。

setCharacterEncoding の使用

クライアントの文字エンコードを判断する断定的なソリューションはありませんが、サーブレット API には、リクエストオブジェクトのエンコードを設定する次に示す便利なメソッドがあるため、残りのリクエストデータは正しく処理されます。

request.setCharacterEncoding

このメソッドを使用してリクエストにエンコードタイプを割り当てることができるので、その後のこのリクエストオブジェクトへの呼び出しでは、リクエストのデータを正しくデコードできます。setCharacterEncoding を使用すると、リクエストデータがデフォルトのエンコードから他のエンコードに変換されるのを防ぐことができます。

リクエストのエンコードは、getParametergetReader を呼び出す前に設定する必要があります。

次の例では、Shift_JIS でエンコードされたフォームの日本語パラメータを標準の
getParameter メソッドで読めるように、エンコードタイプのサーブレットを設定します。

request.setCharacterEncoding("Shift_JIS");
String username = request.getParameter("username");