`

ajax post 编码 乱码问题的解决方法

阅读更多

用ajax提交表单,经常会遇到编码的问题,后台要特殊处理比较麻烦。

今天在网上找了一下,发现jquery prototype等流行的框架也不能很好的解决gbk编码下的乱码问题。

先看几个基本概念:

escape 方法
对 String 对象编码以便它们能在所有计算机上可读,

escape(charString)

必选项 charstring 参数是要编码的任意 String 对象或文字。

说明
escape 方法返回一个包含了 charstring 内容的字符串值( Unicode 格式)。所有空格、标点、重音符号以及其他非 ASCII 字符都用 %xx 编码代替,其中 xx 等于表示该字符的十六进制数。例如,空格返回的是 "%20" 。

字符值大于 255 的以 %uxxxx 格式存储。

注意   escape 方法不能够用来对统一资源标示码 (URI) 进行编码。对其编码应使用 encodeURI 和encodeURIComponent 方法。
========================
encodeURI 方法
将文本字符串编码为一个有效的统一资源标识符 (URI)。

encodeURI(URIString)

必选的 URIString 参数代表一个已编码的 URI。

说明
encodeURI 方法返回一个编码的 URI。如果您将编码结果传递给 decodeURI,那么将返回初始的字符串。encodeURI 方法不会对下列字符进行编码:":"、"/"、";" 和 "?"。请使用 encodeURIComponent 方法对这些字符进行编码。

=======================
encodeURIComponent 方法
将文本字符串编码为一个统一资源标识符 (URI) 的一个有效组件。

encodeURIComponent(encodedURIString)

必选的 encodedURIString 参数代表一个已编码的 URI 组件。

说明
encodeURIComponent 方法返回一个已编码的 URI。如果您将编码结果传递给 decodeURIComponent,那么将返回初始的字符串。因为 encodeURIComponent 方法对所有的字符编码,请注意,如果该字符串代表一个路径,例如 /folder1/folder2/default.html,其中的斜杠也将被编码。这样一来,当该编码结果被作为请求发送到 web 服务器时将是无效的。如果字符串中包含不止一个 URI 组件,请使用 encodeURI 方法进行编码。

=========================

再看一下jquery的处理源码:

function add( key, value ){
			// If value is a function, invoke it and return its value
			value = jQuery.isFunction(value) ? value() : value;
			s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value);
		}
// Return the resulting serialization
		return s.join("&").replace(/%20/g, "+");

 

把key和value都encodeURIComponent了,最后还把%20替换成+

解决办法:在原来基础上再包裹一层encodeURIComponent

encodeURIComponent(encodeURIComponent(value)

function add( key, value ){
	s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(encodeURIComponent(value));
};

 后台解码:java.net.URLDecoder.decode(request.getParameter("name"), "UTF-8″);

 

===========================================

再看一下prototype的处理源码:

$H(extras).each(function(pair) { headers[pair.key] = pair.value });

function $H(object) {
  return new Hash(object);
};

function toQueryPair(key, value) {
    if (Object.isUndefined(value)) return key;
    return key + '=' + encodeURIComponent(String.interpret(value));
  }

toQueryString: function() {
      return this.map(function(pair) {
        var key = encodeURIComponent(pair.key), values = pair.value;

        if (values && typeof values == 'object') {
          if (Object.isArray(values))
            return values.map(toQueryPair.curry(key)).join('&');
        }
        return toQueryPair(key, values);
      }).join('&');
    },

 

在prototype的函数中,会把key和value分别用encodeURIComponent 来把一个字符串转成utf-8的URL编码形式.

比如,"中文"会被编码成:%E4%B8%AD%E6%96%87

但该字符串传到后台时,会被识别成乱码. 用request.getParameter取到的字符串也是乱码,而不是本身的字符。

主要原因是%号,如果该串改成%22E4%22B8%22AD%22E6%2296%2287 也是可以识别的.

解决方法: 在prototype文件中找到 encodeURIComponent? 这段, 在encodeURIComponent 后,再将该字符串用escape方法再编码一次。
这时候传到后台,用request.getParameter,可以得到编码后的正确的字符串。即 %E4%B8%AD%E6%96%87 .
用java.net.URLDecoder.decode(keyword,"UTF-8"); 对这个字符串进行解码,从而得到正确的中文。

 

====================================

 

 总的解决办法:对中文(value)进行编码即可。如果页面和js都是utf-8还可以不用encodeURIComponent。

最后发布下coos脚本库的综合解决办法:

coos.ajax.encode = function(str,encode)
{
	//str为空或不用编码则直接返回
	if (str == null || str == "" || encode=="unencode")
	{
		return str;
	}
	var value = "";
	//value编码采用和jquery一样的处理方式
	//后台解码:java.net.URLDecoder.decode(request.getParameter("name"), "UTF-8″)
	if(encode == "text")
	{
		value = str.replace(/\n|\r/g,"");//去掉换行符号
		value = value.replace(/<\/?.+?>/g,"");//去掉HTML标签
		value = encodeURIComponent(encodeURIComponent(value)).replace(/%20/g, "+");
	}
	else
	{
		value = encodeURIComponent(encodeURIComponent(value)).replace(/%20/g, "+");
	}
	/*//以前自定义的方法,由于后台没有统一的解码方式,不推荐使用
	else
	{
		value = escape(str);
		//替换+号为%2B
		value = value.replace(/\+/g, "%2B");
		//替换%号为%25如"%u2a2a dfd %u1f1f";替换后为%25u2a2a dfd %25u1f1f
		value = value.replace(/%u([0-9A-F]{4})/ig,function(word){return escape(word);});
	}

	java后端没有直接的解码函数,自定义方法为:
	public static String unescape (String str)
	{
		if (str == null)
			return null;
		
		String regEx="%u([0-9A-F]{4})";
		Pattern p=Pattern.compile(regEx);
		Matcher m=p.matcher(str);
		
		StringBuffer sb = new StringBuffer();
		
		while (m.find ())
		{
			String group = m.group ().substring(2);
			m.appendReplacement(sb, String.valueOf((char)(Integer.parseInt(group,16)))); 
		}
		
		m.appendTail(sb);
		
		return sb.toString();
	}
	 	*/
	return value;
};

 

分享到:
评论

相关推荐

    c# ajax post数据乱码解决

    需要对webconfig修改,主要是要修改页面编码格式为utf-8

    ajax中文乱码如何解决

    今天终于解决了AJAX的中文乱码问题,写篇文章来帮助一下...今天把问题解决了,很简单,是使用escape(或encodeURI,两个函数javascript的函数,功能基本相同,可以查一下相关的帮助),但要使用两次,这是解决问题的关键

    AJAX在Post中文的时候解决乱码的方法

    用AJAX来GET回一个页面时,RESPONSETEXT里面的中文多半会出现乱码,这是因为xmlhttp在处理返回的responseText的时候,是把resposeBody按UTF-8编码进解码考形成的,如果服务器送出的确实是UTF-8的数据流的时候汉字会...

    AJAX编码问题

    解决AJAX编码中post提交的乱码问题,很好,实用。

    ajax乱码解决汇总

    ajax乱码解决总结 第一,javascript沿用java的字符处理方式,内部是使用unicode来处理所有字符的, 第二,utf-8是每个汉字(unicode字符)用3个字节来存储。 第三,用utf-8来send数据是不会出现乱码的,是后台程序...

    js调用AJAX时Get和post的乱码解决方法

    在使用"get"时,抓取的页面最后加上编码类型,在使用post时用vbscript解决了编码问题,具体实现如下,有类似情况的朋友可以参考下哈

    JQuery的Ajax中Post方法传递中文出现乱码的解决方法

    本文实例讲述了JQuery中Post传递中文出现的解决方法,即乱码ajax与jquery.ajax中文参数post传递乱码处理方法。分享给大家供大家参考。具体分析如下: 问题一: 今天在做项目时,需要用到Ajax,之前我在用GET方式传递...

    AJAX在Post中文的时候乱码的解决方法

    看到的说明原文如下: 用AJAX来GET回一个页面时,RESPONSETEXT里面的中文多半会出现乱码,这是因为xmlhttp在处理返回的responseText的时候,是把resposeBody按UTF-8编码进解码考形成的,如果服务器送出的确实是UTF-8...

    ajax+php中文乱码解决办法

    AJAX的乱码的出现在的原因 由于XMLHTTP采用的是Unicode编码上传数据,而一般页面采用的是gb2312,这就造成显示页面时产生乱码。而当在获取页面时的XMLHttp返回的... 因而这样可以解决乱码问题 方法二,是都采用UTF-8编码

    jquery ajax post提交数据乱码

    用户用pad访问的时候说有乱码,自己试验了下果然,后发现chrome和ie内核下都是有此问题,此问题设置了页面属性为utf-8时候,只有firefox是传的charset=utf-8的头文件chrome和ie都没有指定,所以出现乱码问题....

    Ajax乱码问题整理

    如果前台页面是gb2312或者其它编码数据就会产生乱码2 post方法提交数据默认的字符编码是utf-8,如果后台是gb2312或其他编码数据就会产生乱码解决方法进一步整理中推荐方法,前台后台都用utf-8编码,这样可以省不少麻烦...

    Ajax传递中文参数到后台乱码的有效解决方法

    使用Ajax传递中文参数,如果不对参数进行处理的话,传到后台会变成乱码,经测试可以使用如下方法 这里是以jquery.autocomplete插件中获取输入框中的数据传到后台为例: 注意要对中文使用encodeURI编码两次 代码如下:...

    XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)

    由于 Ajax 不论任何编码都能正常传送英文,所以用这种方法可以轻松解决。 ——————————————————————————– 用XMLHTTP Post Form时的表单乱码有两方面的原因——Post表单数据时中文乱码;...

    ajax XMLHTTP Post Form时的表单乱码综合解决

    用XMLHTTP Post Form时的表单乱码有两方面的原因——Post表单数据时中文乱码;服务器Response被XMLHTTP不正确编码引起的乱码...换句话说,本文主要解决两个问题——怎样正确Post中文内容&怎样正确显示得到的中文内容。

    使用AJAX实现UTF8编码表单提交到GBK编码脚本无乱码的解决方法

    主要介绍了用AJAX实现,多个不同编码的项目(GBK,UTF8)互相通过 POST/GET 汇总表单数据。最终实现 使用同一个页面接收 不同编码的 表单(GBK,UTF8),特别适合 JS 采集项目,需要的朋友可以参考下

    Asp中使用JQuery的AJAX提交中文乱码解决方法

    代码如下: [removed]  //jquery的post ... UserName:escape(‘软件开发网’),//进行编码  WebSite:’www.jb51.net’  },  function(data)  {  alert&#40;unescape(data&#41;);//对返回数据进行解码  

    有关Ajax中get和post的使用问题

    解决方法:在?后面链接一个num=【随机数Math.random()】或者num=【时间戳new Date().getTime()】,’1.php?username=”May”&’+num(这里没有变量名,避免和后台参数冲突) 2.问题二. 乱码,当传递中文或者特殊...

    在Ajax中使用get和post所遇到的问题及解决办法

    使用get遇到的问题: 1.问题一. 缓存:当每次访问的url相同,客户端直接读取本地缓存里面的内容,即使后台数据变化前台也不会有变化; 解决方法:在?... 2.问题二. 乱码,当传递中文或者特殊...使用post遇到的问题:

    jquery+ajax无刷新评论源码

    做AJAX应用,jquery提供的$.get()、$.post()函数都可以用于提交数据,但建议使用$.ajax()来提交,那两个函数都不 提供错误返回信息,不利全面掌控。 提交数据是action代表要执行的操作,id传递文章id,page是请求的...

Global site tag (gtag.js) - Google Analytics