jQuery.ajax传递中文参数乱码的解决方法
许多人在使用JQuery.ajax方法时肯定会遇到一个问题。在编码不是UTF-8的时候,当传递的参数里有中文的时候,服务端Request的 时候都会出现乱码。本人最近也遇到了需要传递中文参数的问题。在网上搜索一下,复制粘贴发的到处都是的“终极”“解决方案”无非就是 escape(str)来转码,然后在服务端还要写个方法再编辑一次,或用System.Text.Encoding下的方法来换来换去。
很久以前一直在使用Prototype框架。在.net-GB2312或jsp-utf8下都使用过,从来没遇到有字符编码的问题。于是将Prototype和JQuery代码都下载下来打开研究原因。具体结果如下
不同之处在于JQuery默认的contentType:application/x-www-form-urlencoded
而Prototype则是contentType:application/x-www-form-urlencoded; charset=UTF-8
这才是JQuery正在乱码的原因,在未指定字符集的时候,是使用ISO-8859-1
ISO8859-1,通常叫做Latin-1。Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符。
JQuery的Ajax根本没有考虑到国际化的问题,使用了欧洲的字符集,所以才引起了传递中文出现乱码的问题。
而我们的UTF-8则可以解决这一问题。
最终指需要修改JQuery的代码,显式声明contentType使用utf-8字符集,即可解决GB2312中文传递的问题。
修改如图:
只需要简单的将JQuery的jquery.js代码加以修改,将contentType:application/x-www-form-urlencoded 加上charset=UTF-8就可以了,这样不需要改变改什么web.config或什么在页面中改编码什么的了,也不需要用escapc(str)再在服务端解码。英文怎么传递,中文也怎么传递。
另外,增加Servlet filter,记得要放到web.xml Filter最前端,特别是EncodeFilter前:
- public void doFilter(ServletRequest servletRequest,
- ServletResponse servletResponse, FilterChain filterChain)
- throws IOException, ServletException {
- if (logger.isDebugEnabled()) {
- logger
- .debug("doFilter(ServletRequest, ServletResponse, FilterChain) - start"); //$NON-NLS-1$
- }
- HttpServletRequest request = (HttpServletRequest) servletRequest;
- HttpServletResponse response = (HttpServletResponse) servletResponse;
- String requestedWith = request.getHeader("x-requested-with");
- String type = request.getContentType();
- if (requestedWith != null && "XMLHttpRequest".equals(requestedWith)
- && null != type
- && "application/x-www-form-urlencoded".equals(type)) {
- logger.info("This's ajax post.set encode is UTF-8.");
- request.setCharacterEncoding("UTF-8");
- response.setCharacterEncoding("UTF-8");
- request.getParameterMap();
- }
- filterChain.doFilter(request, response);
- if (logger.isDebugEnabled()) {
- logger
- .debug("doFilter(ServletRequest, ServletResponse, FilterChain) - end"); //$NON-NLS-1$
- }
- }
- <filter>
- <filter-name>encodingFilter</filter-name>
- <filter-class>
- org.springframework.web.filter.CharacterEncodingFilter
- </filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>GBK</param-value>
- </init-param>
- <init-param>
- <param-name>forceEncoding</param-name>
- <param-value>true</param-value>
- </init-param>
- </filter>
- <filter>
- <filter-name>ajaxEncodeFilter</filter-name>
- <filter-class>
- com.pengpeng.framework.common.filter.AjaxEncodeFilter
- </filter-class>
- </filter>