`

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数据乱码解决

    本文将详细讲解如何解决C# Ajax Post数据乱码问题。 ### 一、理解问题根源 首先,我们需要了解为什么会出现乱码的情况。这通常是因为客户端和服务器端对于字符编码的理解不一致所导致的。具体来说,如果客户端使用...

    Ajax中文乱码问题解决方案

    在实际开发中,可以结合使用以上方法来解决Ajax中文乱码问题。例如,可以使用jQuery的`$.ajax`方法,设置`contentType`和`dataType`属性,以及在成功回调函数中处理响应数据: ```javascript $.ajax({ url: 'your-...

    Ajax中文乱码问题解决方法

    总的来说,解决Ajax中文乱码问题的关键在于明确和统一字符编码。通过设置请求头、响应头、统一前后端编码以及必要时的数据转换,我们可以有效地避免和修复这个问题。在实际开发过程中,良好的编码规范和测试实践也是...

    ajax提交中文乱码解决方法

    综上所述,解决AJAX提交中文乱码的问题主要涉及客户端和服务端两个方面的编码处理。在客户端通过`URLEncoder`进行编码,并确保Content-Type正确设置;在服务端则通过`URLDecoder`进行解码,并对Servlet容器及程序中...

    ajax到servlet乱码解决

    通过使用 `encodeURI()` 函数在 AJAX 客户端编码 URL 参数和使用 `URLDecoder` 类在 Servlet 服务器端解码 URL 参数,我们可以解决 AJAX 到 Servlet 乱码问题。这样,我们的应用程序可以正确地处理中文参数,从而...

    ajax乱码解决方案

    总的来说,解决Ajax乱码问题的关键在于理解字符编码的工作原理,确保数据在整个传输过程中的编码与解码一致性,以及正确设置服务器和客户端的编码设置。在实际应用中,还应考虑跨平台和跨浏览器的兼容性,以确保解决...

    ajax提交,后台中文乱码解决

    本文将基于提供的文件信息,详细解析两种解决Ajax提交后台取值中文乱码的方法。 ### 方法一:使用URL编码 在第一个示例中,开发者通过调用`encodeURIComponent()`或`encodeURI()`函数对请求URL中的参数进行编码。...

    ajax中文乱码如何解决

    在本文中,我们将深入探讨如何解决使用Ajax进行POST请求时出现的中文乱码问题。首先,我们要理解Ajax中文乱码的根源,它通常涉及到字符编码的不一致,尤其是在客户端与服务器之间的通信过程中。 Ajax(Asynchronous...

    Struts框架下Ajax发送中文乱码问题的解决

    总结来说,解决Struts框架下Ajax发送中文乱码问题的关键在于: 1. 确保Ajax请求时设置正确的`Content-Type`,以UTF-8编码发送数据。 2. 在Struts配置文件中配置`CharacterEncodingFilter`或在Action中手动设置请求...

    Ajax 中文乱码问题

    通过以上介绍的方法,我们可以有效地解决Ajax请求过程中可能出现的中文乱码问题。关键在于确保数据在发送和接收过程中的编码一致性。希望本文能帮助开发者更好地理解和处理这类问题,提升用户体验。

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

    ### AJAX在POST中文时解决乱码的方法 #### 一、问题背景 在使用AJAX进行数据请求时,尤其是在处理中文字符的过程中,经常会遇到一个常见问题:即通过AJAX请求得到的`responseText`中的中文字符出现乱码。这个问题...

    ajax解决乱码问题

    ### 二、使用AJAX解决乱码问题的方法 #### 1. 设置正确的编码格式 在ASP.NET中,可以使用`&lt;globalization&gt;`标签在Web.config文件中设置请求和响应的编码格式。例如: ```xml requestEncoding="utf-8" ...

    Ajax使用POST提交中文乱码问题.docx

    总结来说,解决Ajax POST提交中文乱码问题的关键在于前端编码两次并确保后端使用正确的解码方式。同时,服务器端页面的编码设置也很重要,如`&lt;%@ page pageEncoding="GB18030"%&gt;`确保了JSP页面的编码一致性。在实际...

    AJAX编码问题

    然而,在实际应用中,开发者常常会遇到AJAX请求中的编码问题,特别是POST方式提交数据时出现的乱码现象。本文将详细探讨AJAX编码问题,并提供几种解决方案。 #### 一、AJAX编码问题概述 AJAX(Asynchronous ...

    ajax POST 与GET提交的区别

    - **POST**: 同样存在乱码问题,可以通过设置Content-Type和服务器端编码来解决。 7. **实现细节**: - **GET**: 参数直接拼接在URL后面,如 `http://example.com?name=value`。 - **POST**: 需要通过设置Content...

    解决ajax乱码和页面传值问题

    在Web开发中,Ajax(Asynchronous ...总结,解决Ajax乱码问题主要涉及数据编码、请求头设置和服务器端解码,而页面传值则需根据需求选择适当的方法。理解并熟练运用这些技巧,能显著提升Web应用的性能和用户体验。

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

    AJAX在Post中文的时候乱码的解决方法 ...AJAX在Post中文的时候乱码的解决方法是,在服务器端设置响应头中的字符编码信息,以便客户端正确地解码响应体。这可以避免中文乱码的问题,并确保数据的正确传输。

    Asp中用法JQuery的AJAX提交中文乱码解决方法_.docx

    在Asp中使用JQuery的AJAX提交中文乱码解决方法主要是在客户端使用escape()函数编码中文字符,而在服务器端使用VbsEscape()和VbsUnEscape()函数来编码和解码中文字符。通过这种方法,可以避免中文乱码问题,实现正确...

    Ajax uri 乱码问题总结

    总结来说,解决Ajax URI乱码问题的关键在于理解和匹配浏览器的编码行为,并在服务器端进行相应的配置。通过以上策略,可以有效地解决大部分浏览器的乱码问题,实现更好的跨浏览器兼容性。然而,对于特定情况,可能还...

Global site tag (gtag.js) - Google Analytics