サーブレット内に格納されているリクエストパラメタと、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で指定されているエンコード名で表現したものになっているか確認してください。
関連項目