AjaxButtonとかをShift_JISのページで利用すると文字化けする件について
Wicket-jaのメーリングリストで報告した件ですが、こちらにも載せておきます。
http://lists.sourceforge.jp/mailman/archives/wicket-ja-user/2008-April/000072.html
Wicketにて、
getRequestCycleSettings().setResponseRequestEncoding("Shift_JIS");
でページのエンコーディングをUTF-8以外にして、AjaxButtonをaddしてSubmitさせると、送信されるフォームの内容が
文字化けします。
原因は、AjaxButtonがsubmit時に実行するJavaScriptの中で、
encodeURIComponent()にてPOSTデータはページエンコーディングに
かかわらずutf-8になってしまうためです。
ブラウザからはutf-8でリクエストが送信され、Wicket側はetResponseRequestEncoding()で設定された文字コードでフォームデータをデコードするため、ここで文字化けが発生します。
id:t_yanoが本家にバグ報告をしてくれています。
https://issues.apache.org/jira/browse/WICKET-1569
なので、そのうち直ると思いますが、現時点では、以下のようなFilterをWicketFilterの前にかましてやれば対処は可能です。
(packageは適当になおしてください)
package com.yuroyoro.wicket; import java.io.IOException; import java.io.UnsupportedEncodingException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; public class AjaxEncodingFilter implements Filter { /* (非 Javadoc) * @see javax.servlet.Filter#destroy() */ public void destroy() { } /* (非 Javadoc) * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) */ 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); } /* (非 Javadoc) * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) */ public void init(FilterConfig filterConfig) throws ServletException { } }