尾崎智仁
ozaki****@yuroy*****
2008年 4月 15日 (火) 19:23:33 JST
尾崎です。 アドバイスいただき、ありがとうございました。 自前で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 > -------------- next part -------------- HTMLの添付ファイルを保管しました... Descargar