[Wicket-ja-user 74] Re: AjaxButtonでsubmitしたFormのencodeについて

Back to archive index

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
>
>




Wicket-ja-user メーリングリストの案内
Back to archive index