Ajax发送请求的编码问题

对于亚洲开发者而言,不可避免地需要发送包含非西欧字符的请求参数,而这些请求参数在传输过程中的编码将直接影响服务器的处理。如果发送的请求里不包含非西欧字符,将不会有任何问题;但一旦包含了非西字符,将不会有任何问题;但一旦包含了非西欧字符的请求参数,则可能出现异常。

下面的简单应用通过文本输入获取用户输入,然后分别使用两种方式发送请求,服务器负责用户请求,并将请求参数在控制台中输出。首先看服务器程序。

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
	//需要写这句话,解决中文乱码问题,异步post请求默认采用utf-8字符集来编码请求参数
	request.setCharacterEncoding("utf-8");
	
	System.out.println(request.getParameter("value"));

 %>
上面的服务器响应页面没有生成作何响应,所以 不必用responseText接收响应而只是打印了value请求参数的值,所以也不用在open()方法之前,设置 onreadystatechange来设置回调函数。本应用专门用于分析客户端页面提供了两种方法来发送请求,分别GET和POST方式发送请求。下面是客户端的页面代码。

<!DOCTYPE html>
<html>
  <head>
    <title>first.html</title>
	
    <meta name="keywords" content="keyword1,keyword2,keyword3">
    <meta name="description" content="this is my page">
    <meta name="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

  </head>
  
  <body>
  	<input type="text" name="text" type="text" size="70"/><br>
    <input type="button" value="GET发送"
    		οnclick='getSend(document.getElementById("text").value)'/>
    <input type="button" value="POST发送"
            οnclick='postSend(document.getElementById("text").value)'/>
            
     
    <script type="text/javascript">
    	var xmlrequest;
    	function createXMLHttpRequest(){
    	
    		if(window.XMLHttpRequest){
    		
    		
    			xmlrequest = new XMLHttpRequest();
    	    }
    	   else if (window.ActionXObject){
    	
    			try{
    		
    				xmlrequest = new ActiveXObject("Msxml2.XMLHTTP");
    			}
    			catch(e){
    			
    				try{
    				
    					xmlrequest = new ActiveXObject("Microsoft.XMLHTTP");
    				}
    				catch(e){}
    			}
    		}
        }
        function postSend(value){
        
        	createXMLHttpRequest();
			
			var uri= "show.jsp";	  
			
		 
			
			xmlrequest.open("POST", uri, true);
			
			xmlrequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
			
			xmlrequest.send("value="+value);   
        
        }
        
         function getSend(value){
        
        	createXMLHttpRequest();
			
			var uri= "show.jsp?value="+value;	     
			

			
			xmlrequest.open("get", uri, true);
			
			xmlrequest.send(null);   
        
        }
    </script> 
  </body>
</html>
输入中文,当使用GET方式发送请求时,请求参数变成了乱码。编码问题也是Ajax应用必须处理的问题,对于POST请求很好处理,异步POST请求默认采用UTF-8字符集来编码请求参数,因此只需调用HttpServletRequest的setCharacterEncoding("UTF-8")

字符集来编码请求参数,因此只需调用HttpServletRequest的setCharacterEncoding("UTF-8")即可解决乱码问题。服务器采用如下代码即可获得正确的POST请求参数。

 

另外服器端还可以这样写

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
	//处理POST请求
	if(request.getMethod().equalsIgnoreCase("POST")){
	
		request.setCharacterEncoding("UTF-8");
		System.out.println(request.getParameter("value"));
	
	}
	//处理GET请求
	else if(request.getMethod().equalsIgnoreCase("GET")){
	
		String tmp = request.getParameter("value");
		String a = new String(tmp.getBytes("ISO-8859-1"),"<span style="color:#ff0000;">utf-8</span>");
		System.out.println(a);
	}

 %><strong>
</strong>

可能你用上面的代码用一些浏览器不会发生乱的现象,但事实上,问题依然没有得到解决。如果我们将浏览器更换成其它的浏览器,有可能在文本中输入中文,然后单击Get发送,将看到Tomcat按台中有可再次发生乱码。显然上面的红色编码需要根据客户端浏览器进行改变。

如果你用Firefox发送非西欧字字符请求参数时,可以在发现无论怎样改变编码,都会发生乱码。

解决这个问题的唯一做法是在发送请求的HTML页面固定的URL   Encode,手动编码包含非西欧字符的请求参数,这样就可控制请求。即在客户端的HTML页面采用如下Java代码:

//将包含非西欧字符的请求参数用GBK字符集进行编码
java.net.URLEncoder.encode(请求参数,"GBK");

然后再在服务端采用如下代码
new String(请求参数.getByges("ISO-8859-1","GBK"));
这个过程相当烦琐,而且需要HTML页面中使用Java API,相当不合时宜。因此通常建议发送POST请求,尽量使用GET请求,理由如下:

1.处理GET请求的请求参数参数比罗烦琐。

  2.当请求参数包含的数据太多时,GET请求可能丢失参数。

3.当两次GET请求的请求参数相同时,Internet Exporer将直接使用服器上次的缓存,根本不会重新发请求,这对于自动刷新页面相当不利。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当使用 AJAX 发送数据时,我们通常需要确保数据的编码格式为 UTF-8,以避免中文等非 ASCII 字符出现乱码的情况。以下是使用 AJAX 发送 UTF-8 编码的示例: ``` var xhr = new XMLHttpRequest(); xhr.open('POST', '/api/submit', true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { console.log(xhr.responseText); } }; var data = 'name=' + encodeURIComponent('张三') + '&age=18'; xhr.send(data); ``` 在上面的示例中,我们先通过 `xhr.setRequestHeader()` 方法设置请求头中 `Content-Type` 属性为 `application/x-www-form-urlencoded; charset=UTF-8`,以指定发送的数据编码格式为 UTF-8。 然后,我们使用 `encodeURIComponent()` 方法对数据进行编码,以确保非 ASCII 字符正确传输。最后,使用 `xhr.send()` 方法发送数据。 在服务端接收到数据后,也需要确保数据的编码格式为 UTF-8,以正确解析含有非 ASCII 字符的数据。 ### 回答2: Ajax(Asynchronous Javascript and XML)是一种在网页中使用的异步的Web开发技术,它通过JavaScript和XML(现在也可以是JSON等数据格式)实现数据的异步加载和交互,从而提升用户体验。 UTF-8(Unicode Transformation Format 8-bit)是一种能够对全世界所有字符进行编码的一种字符编码,它可以用来表示Unicode字符集中的所有字符。UTF-8是一种变长的编码方式,它通过使用1到4个字节来表示不同的字符,这样可以减少存储和传输的空间。 在Ajax中使用UTF-8编码有以下几个方面的作用和好处: 1. 多语言支持:UTF-8编码可以支持全球范围内的多种语言,包括中文、英文、法文、德文等等。使用UTF-8编码可以确保在Ajax请求中传输的数据能够正确地表示和处理各种语言的字符。 2. 数据的正确性:UTF-8编码可以将特殊字符和非ASCII字符正确地表示和传输,这对于包含特殊字符或表情符号等的数据处理非常重要。使用UTF-8编码可以避免因特殊字符导致的数据传输错误或乱码问题。 3. 网络传输效率:由于UTF-8是一种变长编码方式,相对于固定长度的编码方式(如UTF-16)来说,它可以节省传输数据的空间。这对于Ajax请求来说尤为重要,因为Ajax请求需要通过网络传输数据,使用UTF-8编码可以减少数据传输量,提升网络传输效率。 总之,Ajax和UTF-8是互相独立的技术,但它们可以结合使用,提升Web应用的用户体验和数据处理能力。通过在Ajax请求中使用UTF-8编码,我们可以确保正确地处理各种语言的字符,避免数据传输错误和乱码问题,同时提高网络传输效率。 ### 回答3: Ajax是一种网页开发技术,用于实现异步的数据交互。而UTF-8是一种字符编码标准,用于表示各种语言的字符。在Ajax中,可以使用UTF-8编码来处理数据的传输和显示。 首先,Ajax可以通过XMLHttpRequest对象发送请求并接收响应数据。当发送请求时,可以通过设置XMLHttpRequest对象的属性来指定使用UTF-8编码。例如,可以使用`xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");`来设置请求头中的字符编码。 在接收响应数据时,可以通过XMLHttpRequest对象的属性来获取服务器返回的数据。如果服务器使用UTF-8编码返回数据,可以直接使用`xhr.responseText`来获取响应内容。 在将数据显示到网页上时,也需要确保网页使用UTF-8编码。可以通过在网页的头部添加`<meta charset="UTF-8">`来指定网页的字符编码。 使用Ajax与UTF-8编码可以更好地处理各种语言的字符。UTF-8编码可以表示世界上所有的字符,包括汉字、日语、韩语等各种字符。而Ajax可以通过异步请求将数据与服务器进行交互,实现更加流畅和高效的用户体验。通过使用Ajax和UTF-8编码,可以轻松地处理多语言环境下的数据交互和显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值