Web サイトは、世界中のあらゆるブラウザからアクセスされます。クライアントはフォームを送信するとき、ブラウザで設定されたエンコードタイプで送信フォームをエンコードします。結果として、すべてのフォームが同じエンコードタイプで送信されるということは当てにできません。Internet Explorer では、[表示] > [エンコード] を選択して、エンコードタイプを表示できます。
このセクションでは、リクエストデータをデコードする次のメソッドを説明します。
setCharacterEncoding
の使用
ブラウザで ISO-8859-1 以外の文字セットが使用される場合、リクエストの Content-Type
ヘッダーのエンコード文字セットが送信されることを 仮定できます。Content-Type
ヘッダーから文字セットを取得するには、request オブジェクトの getCharacterEncoding
メソッドを使用します。この値を使用してフォームデータをデコードし、正しい文字セットを使用してレスポンスで作業できます。
たとえば、クライアントが EUC-JP を使用したフォームを送信し、リクエストのContent-Type
ヘッダーが Shift_JIS
に設定されている場合、処理する側のサーブレットは、リクエストがエンコードされた方法やそれを正しくデコードする方法を判断できます。
サーバは、クライアントのブラウザで使用されたエンコードタイプを無視して、デフォルト文字セット ISO-8859-1 ( Latin-1 とも呼ばれます) を使用して、フォームデータをデコードします。EUC-JP 文字セットを使用してフォームが送信された場合、JRun はエンコード文字セットと異なるデフォルトのデコード文字を使用してリクエストデータをデコードすることになるので、リクエストデータは壊れてしまいます。
デコードが正しく行われるように、Java にはエンコードタイプを設定できる次の 2 つの String コンストラクタがあります。
public String (byte[] bytes, String encoding)
public String (byte[] bytes, int offset, int length, String encoding)
次の例は、文字エンコードタイプと元のフォーム入力の実際のバイト配列を取得して、正しいエンコードタイプで文字列を作成します。
...
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
が返されます。
クライアントの文字エンコードを判断する断定的なソリューションはありませんが、サーブレット API には、リクエストオブジェクトのエンコードを設定する次に示す便利なメソッドがあるため、残りのリクエストデータは正しく処理されます。
このメソッドを使用してリクエストにエンコードタイプを割り当てることができるので、その後のこのリクエストオブジェクトへの呼び出しでは、リクエストのデータを正しくデコードできます。setCharacterEncoding
を使用すると、リクエストデータがデフォルトのエンコードから他のエンコードに変換されるのを防ぐことができます。
リクエストのエンコードは、getParameter
や getReader
を呼び出す前に設定する必要があります。
次の例では、Shift_JIS でエンコードされたフォームの日本語パラメータを標準の getParameter
メソッドで読めるように、エンコードタイプのサーブレットを設定します。
request.setCharacterEncoding("Shift_JIS");
String username = request.getParameter("username");