jquery.form 提交中文时乱码(GBK 乱码)的解决方案

本文介绍了解决JSP页面中文乱码问题的方法,包括统一使用UTF-8编码及通过过滤器根据不同请求类型设置合适的字符集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 在使用jsp开始时,一不小心就会出现中文乱码的情况。通常可以使用如下方法解决:
第一种解决方法:
从jsp到servlet统一使用utf-8编码.全部使用utf-8编码能省去很多麻烦,但一点不足是utf-8编码对汉字是使用3-4个字节,会加大网络传输量。


第二种方法:
1.jsp页面使用GBK
2.使用servlet过滤器设置request.setCharacterEncoding("GBK");google一下就能找到很多怎么使用过滤器转换编码。
以上两种方法能解决大部分的乱码问题,特别是第一种方法,能解决使用ajax提交时的中文乱码问题。如果采用第二种方法,那么在使用ajax提交 表单时仍然会有中文乱码。这是因为ajax方式提交时js使用的是utf-8的编码,过滤器使用gbk进行转码就不正确了,应该使用utf-8进行转码。 要解决这个问题,网上也有很多个版本,其中一个是我曾经采用的在客户端使用encodeURI,然后再在服务器端进行 URLDecoder.decode,这种方案在偶尔处理一下中文是可行的,但是如果页面有大量数据录入,那么这种方案是不可行的。有没有好的解决方法 呢?在经过新一轮的google之后,还是找到了方法。参考http://www.javaeye.com /topic/157698?page=1 。原理就是根据httpheader中的内容来区分是ajax方式请求还是普通的请求。在jquery1.2.6中,ajaxSettings默认设置contentType为"application/x-www-form -urlencoded", 在ajax方法中设置xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");,我们只要在servlet中根据这两个参数值来判断是不是通过xmlhttprequest发起的请求。这里值得 一提的是jquery 在提交form 时对参数进行了encodeURIComponent调用,参见param方法

jQuery




.each( a, function(){
				s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) );
			});


所以传给servlet的就是utf-8编码了,那么我们在过滤器中就必须使用utf-8进行转码。
对其中的过滤器做了下修正,在IE下和chrome下,request.getContentType()的值为"application/x-www-form -urlencoded",但是在firefox下,这个值为"application/x-www-form -urlencoded; charset=UTF-8",不是很明白ff为什么会是这个值。
filter代码如下:

package com




.ajax.demo.action;

import java.io.IOException;

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.HttpServletResponse;

public class AjaxPostFilter implements Filter {

	private static final String IE_CONTENT_TYPE = "application/x-www-form




-urlencoded";
	private static final String FF_AJAX_CONTENT_TYPE = "application/x-www-form




-urlencoded; charset=UTF-8";
	private static final String XMLHTTP_REQUEST = "XMLHttpRequest";
	private static final String AJAX_CHARACTER_ENCODING_UTF8 = "UTF-8";

	public void destroy() {
		// TODO Auto-generated method stub

	}

	public void doFilter(ServletRequest servletRequest,
			ServletResponse servletResponse, FilterChain filterChain)
			throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) servletRequest;
		HttpServletResponse response = (HttpServletResponse) servletResponse;
		String requestedWith = request.getHeader("x-requested-with");
		String type = request.getContentType();
		if (XMLHTTP_REQUEST.equals(requestedWith)&& (FF_AJAX_CONTENT_TYPE.equals(type)
				||IE_CONTENT_TYPE.equals(type))) {
			request.setCharacterEncoding(AJAX_CHARACTER_ENCODING_UTF8);
			response.setCharacterEncoding(AJAX_CHARACTER_ENCODING_UTF8);
//			request.getParameterMap();
		}
		filterChain.doFilter(request, response);

	}

	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub

	}

}



web.xml配置,我用的是struts

<filter>
		<filter-name>ajaxEncodeFilter</filter-name>
		<filter-class>com




.ajax.demo.action.AjaxPostFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>ajaxEncodeFilter</filter-name>
		<url-pattern>*.do</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>ajaxEncodeFilter</filter-name>
		<url-pattern>*.jsp</url-pattern>
	</filter-mapping>



这个filter应该在你的EncodeFilter之后,RoyMax说要在之前,我试了下是不行的。
经过这样设置之后,jsp使用gbk采用ajax提交就不会存在中文乱码了。

在使用chrome进行测试时,还发现chrome的一个奇怪问题,对于返回的结果,使用jquery .ajax处理

 

博文来源:http://jasin2008.javaeye.com/blog/312854

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值