tj_takehana
tgens****@gmail*****
2008年 4月 15日 (火) 21:34:59 JST
どうも竹花です。 ちょっと気になったので調べてみたのですが、こちらのフォーラムに開発者Matej Knoppさんの回答(?)がありました。 http://markmail.org/message/ml7ofypidrcoia5e 要点は以下二つです。 ・通常、ユーザが(Ajaxで)使うのはUTF-8 ・UTF-8はよりセキュア 確かにXMLの推奨コードはUTF-8/16ですので、Ajaxは基本UTF-8でいいのかもしれません。 しかし、Ajax通信がUTF-8で行われるのがデフォルトならば、尾崎様が書いたようなフィルターもデフォルトで存在するべきなような気がします。 それか、最初からsetResponseRequestEncodingがAjaxButtonに適用されないようにするとか。 意見すべきなのか、解決策があるのか… 確認のため、簡易AjaxButtonページをつくりAjax通信時のログを見てみたのですが、尾崎様のおっしゃるとおり、ページの文字コードに関わらずパラメータはすべてUTF-8にURIエンコードされていました。 (SJIS, EUC, UTF-8のみなので"すべて"とは言い切っていいものか疑問ですが。) 08/04/15 に Toshihiro Shimizu<shimi****@gmail*****> さんは書きました: > 清水(meso)です。 > > なるほど! > Filterで処理するのはいい考えですね。 > こちらでも上手くいくことを確認しました。 > > しかし、これは対処療法であって、WicketのAjaxリクエストがUTF-8以外を上手に扱えないという事実は変わりませんね。 > > 矢野さんあたりが何とかしてくれないかなぁ(と無茶ぶりしてみる)。 > > 08/04/15 に 尾崎智仁<ozaki****@yuroy*****> さんは書きました: > > > 尾崎です。 > > > > アドバイスいただき、ありがとうございました。 > > > > 自前でgetByte("utf-8")とする方法も考えたのですが、 > > Filterを追加することで対応しました。 > > > > ようは、AjaxButtonなどWicket.Ajax.Call.submitForm()で送信されるPOSTデータのみ、 > > utf-8でエンコードできればよく、それ以外はShift_JISでOKと考え、 > > WicketFilterの前に以下のようなFilterを追加すると、うまく行きました。 > > > > Ajaxでの送信時には、リクエストヘッダーにWicket-Ajax : trueと設定されることを > > 利用して、Ajaxでの送信か判定しています。 > > > > ///////以下FilterのdoFilter()///// > > public void doFilter(ServletRequest request, ServletResponse response, > > FilterChain chain) throws IOException, ServletException { > > > > HttpServletRequest httpServletRequest = (HttpServletRequest)request; > > String ajaxHeader = > > httpServletRequest.getHeader("Wicket-Ajax"); > > > > if (ajaxHeader != null && ajaxHeader.length() > 0 && > > ajaxHeader.equalsIgnoreCase("true")) > > { > > > > httpServletRequest.setCharacterEncoding("utf-8"); > > request = new > > HttpServletRequestWrapper(httpServletRequest){ > > > > /* (非 Javadoc) > > * @see > > javax.servlet.ServletRequestWrapper#setCharacterEncoding(java.lang.String) > > */ > > @Override > > public void setCharacterEncoding(String enc) > > throws UnsupportedEncodingException { > > // 何もしない > > } > > > > }; > > } > > > > chain.doFilter(request, response); > > } > > > > 08/04/15 に Toshihiro Shimizu <shimi****@gmail*****> さんは書きました: > > > 清水(meso)です。 > > > > > > なるほど、ブラウザ判定でShift_JISなんですね。それはかなり茨の道ですね。 > > > おっしゃるとおり、今はUTF-8で作っとくのがベストだと思います。 > > > とはいえ、Shift_JISでもなんとかならんかなと、いじってみました。 > > > > > > AjaxButtonのonSubmitメソッドを > > > > > > @Override > > > protected void onSubmit(AjaxRequestTarget target, Form form) { > > > try { > > > byte[] bytes = > > textField.getModelObjectAsString().getBytes( > > > "Shift_JIS"); > > > result.setModelObject(new > > String(bytes, "UTF-8")); > > > target.addComponent(result); > > > } catch (UnsupportedEncodingException e) { > > > // TODO Auto-generated catch block > > > e.printStackTrace(); > > > } > > > } > > > > > > こんな感じにしたら、「ああああ」と入力すれば「ああああ」と文字化けせずに表示できました。 > > > が、「あいうえおかきくけこ」を入力したら「あい????おかきくけこ」と表示されました・・・。 > > > でもこれってWicketのせいじゃないだろうから、なんとかしようがありそうな気も。 > > > > > > 08/04/15 に 尾崎智仁<helme****@gmail*****> さんは書きました: > > > > > > > 尾崎です。 > > > > > > > > 言葉足らずですみません・・・。 > > > > > > > > > HTMLをShift_JISで作成し、HTMLのHEAD内で > > > > > <meta http-equiv="content-type" content="text/html; charset=sjis"/> > > > > > と指定し、Applicationクラスのinitメソッド内で > > > > > > > > > > > getRequestCycleSettings().setResponseRequestEncoding("Shift_JIS"); > > > > > と指定したところ、確かに文字化けすることを確認しました。 > > > > 上記のとおりです。 > > > > > > > > もう少し詳細に書くと、 > > > > テンプレート・ファイルを文字コードShift_JISで、XHTMLで作成しました。 > > > > XML宣言にもencoding="Shift_JIS"を指定しています。 > > > > さらに、 > > > > > > getRequestCycleSettings().setResponseRequestEncoding("Shift_JIS");と指定しています。 > > > > > > > > この状態だと、ブラウザに出力されるHTMLはShift_JISとなります。 > > > > (ブラウザ側もShift_JISで解釈しています。) > > > > > > > > で、submitを行うと、フォームのデータをutf-8でencodeした > > > > POSTデータが、サーバに送信されます。 > > > > > > > > wicket-ajax.jsの370行目で行われているencodeURIComponent(text);で、 > > > > POSTデータはutf-8にされているようです。 > > > > (encodeURIComponent でエンコードされたデータは、 > > > > クライアントのキャラクタセットにかかわらず、utf-8 になります) > > > > > > > > > > しかし、サーバ側ではgetRequestCycleSettings().setResponseRequestEncoding("Shift_JIS");と指定しているため、 > > > > > > Wicket側でHttpServletRequest.setCharacterEncoding("Shift_JIS")を設定し、 > > > > 結果POSTデータをShift_JISとしてエンコードしようとして文字化けとなっていると思われます。 > > > > > > > > これって、Wicketのバグなんでしょうか? > > > > > > > > > > とりあえず、getRequestCycleSettings().setResponseRequestEncoding("utf-8");で > > > > 対応しましたが、ちょっと気持ち悪い感じです。 > > > > まぁ、いまは全部utf-8で作っとけってことなんですかね。 > > > > > > > > 08/04/15 に Toshihiro Shimizu <shimi****@gmail*****> さんは書きました: > > > > > 清水(meso)です。 > > > > > > > > > > HTMLをShift_JISで作成し、HTMLのHEAD内で > > > > > <meta http-equiv="content-type" content="text/html; charset=sjis"/> > > > > > と指定し、Applicationクラスのinitメソッド内で > > > > > > > > > > > getRequestCycleSettings().setResponseRequestEncoding("Shift_JIS"); > > > > > と指定したところ、確かに文字化けすることを確認しました。 > > > > > > > > > > しかし、そのページのソースをブラウザから表示してみると、 > > > > > <meta http-equiv="content-type" content="text/html; charset=sjis"/> > > > > > は削除されており、ページのエンコードもUTF-8だと判定されていました。 > > > > > > > > > > なので、 > > > > > > > > > > > getRequestCycleSettings().setResponseRequestEncoding("Shift_JIS"); > > > > > を > > > > > > > > > > > getRequestCycleSettings().setResponseRequestEncoding("UTF-8"); > > > > > にすると、文字化けが解消されました。 > > > > > > > > > > > > > > > > 「HTMLをShit_JISに」するというのが、ブラウザでのエンコード判定もShit_JISになっていることを意味しているのか分からなかったので、もしかしたら的外れな返答かもしれませんが、よかったら試してみてください。 > > > > > > > > > > 08/04/14 に 尾崎智仁<ozaki****@yuroy*****> さんは書きました: > > > > > > > > > > > はじめまして。尾崎と申します。 > > > > > > > > > > > > HTMLをShift_JISにして、AjaxButtonでsubmitすると、 > > > > > > Form内のテキストフィールド内の文字を問答無用でutf-8で > > > > > > encodeして送信しているようです。 > > > > > > > > > > > > > > > > > > サーバ側では、getRequestCycleSettings().setResponseRequestEncoding("Shift_JIS");と > > > > > > 指定しているため、Shift_JISと解釈して文字化けが発生します。 > > > > > > > > > > > > どうも、wicket-ajax.jsの370行目で > > > > > > return encodeURIComponent(text); > > > > > > としている部分が問題のようです。 > > > > > > > > > > > > このような現象の回避方法を、どなたかご存じないでしょうか? > > > > > > (そもそも全部utf-8で作ればいいんですけど・・・。) > > > > > > > > > > > > > > > > > > > > > > > _______________________________________________ > > > > > > Wicket-ja-user mailing list > > > > > > Wicke****@lists***** > > > > > > > > > > > > http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user > > > > > > > > > > > > > > > > > > > > > > _______________________________________________ > > > > > Wicket-ja-user mailing list > > > > > Wicke****@lists***** > > > > > > > > > > > http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user > > > > > > > > > > > > > > > > > _______________________________________________ > > > > Wicket-ja-user mailing list > > > > Wicke****@lists***** > > > > > > http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user > > > > > > > > > > > > > > _______________________________________________ > > > Wicket-ja-user mailing list > > > Wicke****@lists***** > > > > > http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user > > > > > > > > > _______________________________________________ > > Wicket-ja-user mailing list > > Wicke****@lists***** > > http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user > > > > > > _______________________________________________ > Wicket-ja-user mailing list > Wicke****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user >