Toshihiro Shimizu
shimi****@gmail*****
2008年 4月 15日 (火) 19:39:24 JST
清水(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 > >