- PR -

struts1.2でfileupload時に通常のパラメータが文字化け

1
投稿者投稿内容
どもんじょ
会議室デビュー日: 2003/06/17
投稿数: 10
投稿日時: 2005-08-30 23:18
WAS6にてstruts1.2を導入して開発しています。
HTMLフォームから日本語のパラメータを文字化けしないようにするためにWASに
default.client.encoding=Cp943C
の設定を行い、これまでうまくいっていました。

ところが、fileuploadのプログラムを開発したところ、ファイル名は文字化けしていないのですが、ファイル以外の通常のパラメータが文字化けしてしまいます。
そこで、文字化けするパラメータを
 new String(s.getBytes("iso-8859-1"), "Cp943C");
としてあげると文字化けが解消されました。
ちなみにパラメータは、DynaActionFormで取得しています。

まず、なぜこういったことが起きるのかが疑問なのと、プログラムではなく設定などで解決する方法はないでしょうか?
つばさ
ベテラン
会議室デビュー日: 2005/02/05
投稿数: 54
投稿日時: 2005-09-01 07:17
WASは、使った事がないのでわかりませんが、
サーブレットフィルターでリクエストの文字コードを設定されてはいかがでしょうか。
具体的には、以下の様なフィルタークラスを作成する。
package filter;
....
public class CodeFilter implements Filter{
public void doFilter(ServletRequest request,ServletResponse response,
FilterChain chain)throws IOException, ServletException {
request.setCharacterEncoding("cp943c");
chain.doFilter(request,response);
}
}
web.xmlにフィルターを登録する。
<filter>
<filter-name>Encoding</filter-name>
<filter-class>filter.CodeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

時間がないので、今は調べきれていませんが、strutsでマルチパートリクエスト
の場合にどこで文字変換が、どのようなルールで行われているかがわかればもっと
よい対処があるかもしれません。
有識者の方、ご教授ください。

どもんじょ
会議室デビュー日: 2003/06/17
投稿数: 10
投稿日時: 2005-09-02 09:58
つばささん、ありがとうございます。
その後いろいろと調べましていくつか分かりました。

マルチパートリクエストのパラメータは、request.getCharacterEncoding()がnullでない場合はその文字コードでエンコードされます。nullの場合はISO-8859-1でエンコードされます。
この処理はorg.apache.struts.upload.CommonsMultipartRequestHandler#addTextParameter(HttpServletRequest, FileItem)で行われています。

そこで今回の現象を見てみると、マルチパートリクエストの場合だけgetCharacterEncoding()の結果がnullであることが分かりました。
ということはその値をCp943Cにしてあげればいいのですが、方法としてはつばささんのご提案の通り、ServletFilterしかないのかなと思っています。
実際試したらうまくいきました。

そもそもWASの設定(default.client.encoding)でCp943Cを設定しているので、なぜマルチパートの時だけ文字コードがnullになってしまうのかという点は不明です。
ServletFilterの対応ですとWASの設定とServletFilterの設定で二箇所にCp943Cを記述しなければいけないのがいまいち腑に落ちないのですが、今回はこの対応で行きたいと思います。
1

スキルアップ/キャリアアップ(JOB@IT)