10
4
2011
0

略记 Ajax发送中文数据的小问题

环境:

  Myeclipse 8.0 , Servlet ,  XP System ,  Browser: ie 8 & ff 7

    最近在学Ajax,在测试中发现如果post或get方式直接发送中文会存在一些问题,因为数据的处理和发送是我们自己编写代码来处理的。本来表单提交时的中文处理是浏览器帮我们进行了转码处理,so提交的都是转码处理后的数据,不会存在中文的。一般而言,初学Ajax时可能还没考虑到过自己处理转码问题的,so会碰到一些所谓的奇怪现象,比如,对Ajax提交的中文数据,在服务器端不需要转码就能正确读取了………… 下面来看看不同的浏览器的不同现象,因为不同浏览器的实现有所不同~

首先FF优先~ ,都7.0了呢,最近升级真快~  如下post代码

 var name = document.getElementById("username").value;
 xmlhttpreq.open("post","CheckName?dt="+new Date().getTime());
 xmlhttpreq.onreadystatechange=function(){...};
 xmlhttpreq.setRequestHeader("Content-Type","application/x www-form-urlencoded;");
 xmlhttpreq.send("name="+name);

如果name是ASCII码的任意组合,那一定不会有问题,可以如果是中文的话,直接发送中文情况就不同了。

1 POST:如上代码在ff中运行后,servlet(即服务器端)中不需转码就能正确读取了…………  总觉得很奇怪…… 于是通过TCP/IP Monitor查看了下发送的http数据,在协议体中的数据居然显示的是中文的,所以备感奇怪,网上查了下说是ajax默认会将中文转码成utf-8格式,so在协议头中发现了这句:Content-Type: application/x-www-form-urlencoded; charset=UTF-8;  ,这个在js代码中设置的,然后试了下在设置中自定义编码,发现不行,ff会将其置成UTF-8的,然后发现协议体的长度Content-Length,是根据utf-8编码方式来计算的(一个中文3个字节),so所发送的数据格式utf-8的。然后服务器接收到数据后通过协议头发现其是UTF-8编码数据,就将其转成了能识别的数据了,所以没有出现乱码…………

2 GET:get的代码不发了,就改下就行了。如果是get的,ff会将中文以utf-8方式进行url转码的(不是content-type中设置的编码方式!)。所以在servlet中需要进行处理,即如:

String name = new String(request.getParameter("name").getBytes("iso-8859-1"),"utf-8");

这样的处理。不然读到的只是乱码……

--------至此ff基本清楚了,当然也没那么的清楚,基本了解即可。

PS:有些细节上的问题,这里不多说也,如:get或post的时候,如果请求的地址一样,那浏览器可能会从缓存中读取,当然不同的浏览器情况也不一样~ 这不是这里的重点!

 

    然后是ie了,虽然出了ie9,但不方便测试啊!对了与ff测试中是两样的代码!

1 GET:查看了发送的协议头数据,居然为:GET /CheckName?name=中文&dt=2222 HTTP/1.1 , 这个更厉害…… 居然get中有中文…………经过多番尝试,在servlet通过

String user = new String(request.getParameter("name").getBytes("iso-8859-1"),"gbk");

能够得到正确的数据,难道ie将中文以gbk的数据发送了?(PS:页面编码为utf-8&gbk都这样……) 似乎是的,反正没有像表单提交那样进行url编码,而是直接以gbk编码方式的二进制数据发送了,但所达到的效果是和以gbk方式进行url编码一样的效果(可能servlet的处理有这样的效果,别的开发语言就不知道如何了!)。

2 POST:测试之后发现,其不像ff会在Content-Type: application/x-www-form-urlencoded;后添加charset=utf-8,但我们可以自己设置,在

xmlhttpreq.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");

中设置,但不管设置什么,ajax默认都是以utf-8格式发送中文的,但所设置的会影响服务器对这些数据的处理(即以何种编码进行转码……)。如果charset设成gbk,则servlet需要进行转码,如:

String name = new String(request.getParameter("name").getBytes("gbk"),"utf-8");

的转码处理,但不知为何,比如仅输入“中”,servlet输入是乱码,但如输入“中文”则正确输出了…… 无语…… 不知道哪里的问题……(可能是因为 request.getParameter(String) 方法会进行一次 URI 的解码过程的原故)

但如果先request.setCharacterEncoding("UTF-8");,然后直接getParameter的话就不会有问题了…… 这个过程该如何解释?是以utf-8方式解读协议体中的数据?似乎是的。但是上一种的方法又该如何解释?这个只能从服务器的实现上来解释了,但有必要去了解这个吗?(毕竟这种情况肯定是会被抹杀掉的……)看来只能留作思考了!!!

     所以为了避免这种问题的出现,应该先进行转码处理,然后再发送…………但这不是本文所要说的。

Category: Web编程 | Tags: ajax Servlet JSP | Read Count: 1852

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com