ページの先頭行へ戻る
 Apcoordinatorユーザーズガイド

F.5.3 文字化けを調査したい

サーブレット内に格納されているリクエストパラメタと、Apcoordinatorが保持しているリクエストパラメタの文字コード情報を比較することで、文字化けが発生した場合の原因調査を行なうことが可能です。

文字コード情報の出力方法

文字コード情報はcom.fujitsu.uji.HttpDispatchContextクラスのdumpParametersメソッドを利用することで取得することができます。 以下は標準出力に文字コード情報を出力する場合の使用例です。

import com.fujitsu.uji.GenericHandler;
import com.fujitsu.uji.DispatchContext;
import com.fujitsu.uji.http.HttpDispatchContext;

public class SampleHandler extends GenericHandler {
    public void doSomething(DispatchContext context, MyDataBean bean) {
        ((HttpDispatchContext)context).dumpParameters();
        ...
    }
}

※ dumpParameters(PrintStream out)メソッドを用いることで出力先を指定することも可能です。

文字コード情報

文字コード情報は1個のリクエストパラメタごとにキーと値をそれぞれ16進で出力されます。出力された文字コード情報は次のとおりです。

  -- dumpParameters start --
  encoding:shift_jis                  ←Apcoordinatorが使用するエンコード名
  ...
  (省略)
  ...
  +----
  | 7                                 ←Parametersクラスに格納されているパラメタの項番
  | ServletRequest
  |   name=?f?[?^1
  |   key  : 6e 61 6d 65              ←キーの文字列のバイトデータの16進表示
  |   value: 83 66 81 5b 83 5e 31     ←値の文字列のバイトデータの16進表示
  | -----------------------------------------------------
  | Parameters
  |   name=データ1
  |   key  : 00 6e 00 61 00 6d 00 65  ←キーの文字列のcharの16進表示
  |   value: 30 c7 30 fc 30 bf 00 31  ←値の文字列のcharの16進表示
  +----
  +----
  | 8
  | ServletRequest
  |   [0]array1=?f?[?^2               ←同一キーに対して複数の値が存在する場合
  |   [1]array1=
  |   key  : 61 72 72 61 79 31
  |   value[0]: 83 66 81 5b 83 5e 32
  |   value[1]: (length:0)            ←値の文字列長が 0 の場合
  | -----------------------------------------------------
  | Parameters
  |   [0]array1=データ2
  |   [1]array1=
  |   key  : 00 61 00 72 00 72 00 61 00 79 00 31
  |   value[0]: 30 c7 30 fc 30 bf 00 32
  |   value[1]: (length:0)
  +----
  -- dumpParameters end --

encodingに記載されている文字列がServletRequestをParametersクラスに格納する際に使用したエンコード名です。 例えば、上記の出力例の項番7の場合、ServletRequestのvalue列"83 66 81 5b 83 5e 31"がshift_jisの"データ1"を表しており、shift_jisからUnicodeに変換してParametersクラスに格納したものが"30 c7 30 fc 30 bf 00 31"となります。文字化けが発生しているということは、言い換えるとServletRequestに格納されている文字情報に対して、誤ったエンコード名が指定されているということになります。ServletRequestに格納されているバイトデータの16進表示が、その文字列をencodingで指定されているエンコード名で表現したものになっているか確認してください。

関連項目