`
smildlzj
  • 浏览: 7999 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

jQuery ajax在GBK编码下表单提交终极解决方案(非二次编码方法)

阅读更多

[版权声明]:版权归作者所有,转载时请以超链接形式标明文章原始出处和作者信息及本声明:
http://www.open-lib.com/Forum/Read_69_1.action

前言:

当jquery ajax在utf-8编码下(页面utf-8,接收utf-8),无任何问题。可以正常post、get,处理页面直接获取正确的内容。

但在以下情况下:

GBK -> AJAX POST ->GBK

UTF-8 -> AJAX POST ->GBK

后台代码无法获取正确的内容,通常表现为获取到奇怪字符、问号。

经典解决方法:

1:发送页面、接收页面均采用UTF-8编码。

2:发送页面在调用ajax post方法之前,将含有中文内容的input用encodeURIComponent编码一次,而接收页面则调用解码方法( 如:java.net.urldecoder.decode("接收到内容","utf-8")  )。


其中,第一种方法无疑是最简单、最直接,但往往不符合实际,因为很多项目并不是使用utf-8编码,例如国内大部分使用gbk编码,也不可能为了解决这样一个问题,而将整个项目转换为utf-8编码,成本太大,风险太高。

第二方法,是现在最多人使用的方法,俗称二次编码,为什么叫二次编码,等下会解释。客户端编码两次,服务端解码两次。但这种方法不好的地方,就是前台手动编码一次,后台再手动解码一次,稍不留神就会忘记,而且代码掺和前台逻辑。

交互过程:

当我们使用表单按照传统方式post提交时候(非AJAX提交),浏览器会根据当前页面编码,encode一次,然后发送到服务端,服务端接收到表单,会自动dencode一次,通常这个过程是对程序是透明的,因此加上手动编码、解码,就变成上面所说的二次编码。

但当我们使用AJAX方式提交时候,浏览器并不会自动替我们encode,因此在jquery中有这样的一段代码:

ajax: function( s ) {
	// Extend the settings, but re-extend 's' so that it can be
	// checked again later (in the test suite, specifically)
	s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));

	var jsonp, jsre = /=?(&|$)/g, status, data,
		type = s.type.toUpperCase();

	// convert data if not already a string
	if ( s.data && s.processData && typeof s.data !== "string" )
		s.data = jQuery.param(s.data);
........	
}

以上是jquery的ajax方法的代码片段,下面是正常调用jquery ajax post的代码:

$.ajax({
 url: ajaxurl,
 type: 'POST',
 dataType: 'html',
 timeout: 20000,//超时时间设定
 data:para,//参数设置
 success: function(html){

 }
});

通过上面代码可以知道,当设置了data时候,jquery内部会调用jQuery.param方法对参数encode(执行本应浏览器处理的encode)。

jQuery.param=function( a ) {
	var s = [ ];
	function add( key, value ){
		s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value);
	};
	// If an array was passed in, assume that it is an array
	// of form elements
	if ( jQuery.isArray(a) || a.jquery )
		// Serialize the form elements
		jQuery.each( a, function(){
			add( this.name, this.value );
		});

	// Otherwise, assume that it's an object of key/value pairs
	else
		// Serialize the key/values
		for ( var j in a )
			// If the value is an array then the key names need to be repeated
			if ( jQuery.isArray(a[j]) )
				jQuery.each( a[j], function(){
					add( j, this );
				});
			else
				add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] );

	// Return the resulting serialization
	return s.join("&").replace(/%20/g, "+");
}//jquery.param end

上面是jQuery.param的代码,细心点可以留意到encodeURIComponent这方法,这是javascript内置的方法,对目标字符串执行utf-8 encode,因此,当页面使用gbk编码时候,服务端会使用gbk进行解码,但实际提交的数据是以utf-8编码的,所以造成接收到内容为乱码或者为问号。

解决方法:

encodeURIComponent会以utf-8编码,在gbk编码下,可不可以以gbk进行编码呢?

如果还在打encodeURIComponent主意的话,那不好意思,encodeURIComponent只会utf-8编码,并没有其他api进行其他编码;不过,别担心,看看下面:

encodeURIComponent,它是将中文、韩文等特殊字符转换成utf-8格式的url编码。

escape对0-255以外的unicode值进行编码时输出%u****格式,其它情况下escape,encodeURI,encodeURIComponent编码结果相同。

哈哈,看到希望吧?没错,就是用escape代替encodeURIComponent方法,不过必须注意:

escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z

encodeURIComponent不编码字符有71个:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z

使用了escape之后必须对加号进行编码,否则,当内容含有加号时候会被服务端翻译为空格。

终于知道解决办法了,重写jquery代码:

jQuery.param=function( a ) {
	var s = [ ];
	var encode=function(str){
		str=escape(str);
		str=str.replace(/+/g,"%u002B");
		return str;
	};
	function add( key, value ){
		s[ s.length ] = encode(key) + '=' + encode(value);
	};
	// If an array was passed in, assume that it is an array
	// of form elements
	if ( jQuery.isArray(a) || a.jquery )
		// Serialize the form elements
		jQuery.each( a, function(){
			add( this.name, this.value );
		});

	// Otherwise, assume that it's an object of key/value pairs
	else
		// Serialize the key/values
		for ( var j in a )
			// If the value is an array then the key names need to be repeated
			if ( jQuery.isArray(a[j]) )
				jQuery.each( a[j], function(){
					add( j, this );
				});
			else
				add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] );

	// Return the resulting serialization
	return s.join("&").replace(/%20/g, "+");
}

上面那段代码并不需要在jquery的源文件重写,可以在你项目的javascript贴上,覆盖它原有的方法,不过必须在jquery加载之后。

经初步验证,上面那段代码在utf-8编码也可以工作正常,大概是编码成unicode的缘故吧。

这样,就不是需要使用什么二次编码,即影响前台,又影响后台。gbk编码下ajax post不再是问题了,此乃是终极解决方法。哈哈。

有兴趣的可以到http://www.open-lib.com/Forum/Read_69_1.action与作者交流。

分享到:
评论

相关推荐

    jQuery ajax在GBK编码下表单提交终极解决方案(非二次编码方法)

    现在,针对GBK编码环境下使用jQuery AJAX提交表单的问题,文章提出了一个终极解决方案,也就是非二次编码方法。这种方法避免了复杂的编码解码过程,可以有效解决问题。 核心思想是这样的:由于GBK和UTF-8编码是不同...

    jQuery学习记录----页面缓存和中文处理(三)

    在处理表单提交时,确保表单的enctype属性设置为"application/x-www-form-urlencoded",以正确编码非英文字符。 总之,页面缓存和中文处理是Web开发中的常见问题,理解并掌握这些技巧将有助于提升应用的性能和用户...

    如何解决JQuery ajaxSubmit提交中文乱码

    在Web开发过程中,使用JQuery的ajaxSubmit方法进行表单提交时,中文乱码问题是一个常见的困扰。中文乱码问题通常发生在数据的提交和接收过程中,由于字符编码的不一致导致。为了解决这个问题,首先需要了解JQuery的...

    三级联动的select xml gbk版

    在IT行业中,三级联动的Select组件常常用于网页表单设计,尤其在数据层级关系复杂的场景下,例如省市区选择、类别分类等。本资源“三级联动的select xml gbk版”是一个基于XML数据源实现的三级联动下拉框,特别之处...

    解决ajax+php中文乱码的方法详解

    表单提交和AJAX提交的区别在于,表单提交时,浏览器会根据页面的编码来编码数据,然后以该编码形式发送给服务器,服务器也应使用相同的编码解析。而在AJAX提交中,数据通常是JSON格式或者URL编码的字符串,这时就...

    一句话jquery 取中文字节数

    由于中文字符在不同的编码方式下所占的字节数不同,因此计算中文字符的字节数需要考虑其具体的编码格式。例如,在UTF-8编码中,可以使用正则表达式来匹配非ASCII字符,并将其替换为特定的字符串(如题目中的"aa"),...

    ajax 的post方法实例(带循环)

    AJAX的POST方法是用于向服务器发送异步请求的一种方式,通常用于提交表单数据或者发送其他类型的数据。POST请求的主要优点是它可以在请求体中携带大量数据,这对于上传文件或传递复杂结构的数据非常有用。POST方法...

    AJAX 动态获取当前时间(php)

    AJAX(Asynchronous JavaScript ...在实际开发中,AJAX常用于加载新内容、提交表单数据、实时反馈等场景。对于PHP开发者来说,掌握AJAX技术能提升网站的用户体验,而结合JSON等数据格式,还可以实现更复杂的数据交换。

    SSH项目的实现步骤.doc

    - 创建一个名为`CharFilter`的过滤器类,实现`Filter`接口,通过`init()`方法获取字符集参数,并在`doFilter()`方法中处理请求和响应的字符编码。 4. **建立entity包并生成实体类**:在Hibernate框架下,你需要...

    基于PHP的迅捷php网络留言本 1.1 GBK.zip

    3. **JavaScript文件** - 可能包括jQuery或其他库,用于增强用户体验,如表单验证和Ajax交互。 4. **数据库配置文件** - 如config.php,包含连接到数据库所需的参数。 5. **数据库脚本** - 如sql.sql,用于创建留言...

    用户注册登录系统(含用户名密码验证码验证)

    jQuery是一个强大的JavaScript库,它简化了DOM操作,事件处理,动画效果以及AJAX交互。在用户注册登录场景中,jQuery用于在客户端实时检查用户输入,如用户名、密码和验证码是否为空,避免无效数据提交到服务器,...

    php多文件上中文无乱码

    当用户提交包含`<input type="file">`的表单时,服务器端的`$_FILES`会包含关于上传文件的信息,如文件名、类型、大小、临时存储路径等。可以使用`move_uploaded_file()`函数将临时文件移动到指定位置,确保文件安全...

    PHP+Ajax实现的检测用户名功能简单示例

    Ajax(Asynchronous JavaScript and XML)是一种创建动态网页的技术,它允许网页在不重新加载整个页面的情况下与服务器交换数据并更新部分网页内容。这通常通过创建或使用XMLHttpRequest对象来实现。 在提供的示例...

    phpcms2008_gbk

    Phpcms 采用模块化方式开发,功能强大灵活易于扩展,并且完全开放源代码,面向大中型站点提供重量级网站建设解决方案。3年来,凭借Phpcms团队长期积累的丰富的Web开发及数据库经验和勇于创新追求完美的设计理念,...

    php笔记-欢迎增加

    - **目的**:确保数据在不同环境下的正确显示和处理。 - **类型**: - **基本编码转换**:如UTF-8到GBK。 - **XML编码**:处理XML文档中的字符编码问题。 - **页面编码**:设置网页的字符编码。 - **BOM编码**:...

    农业企业网站设计程序代码(可编辑仅供参考).docx

    10. **互动功能**:现代农业企业网站通常会包含用户评论、在线咨询、在线预订等功能,这些可以通过表单提交、Ajax异步请求等方式实现,增强用户体验。 综上所述,农业企业网站设计涵盖了前端开发的多个方面,包括...

    PhpCms2008 SP4 20111122 简体GBK

    Phpcms 采用模块化方式开发,功能强大灵活易于扩展,并且完全开放源代码,面向大中型站点提供重量级网站建设解决方案。3年来,凭借Phpcms团队长期积累的丰富的Web开发及数据库经验和勇于创新追求完美的设计理念,...

Global site tag (gtag.js) - Google Analytics