10
4
2011
2

略记 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: 2610
Avatar_small
TN SSLC Previous Pap 说:
2022年8月25日 22:56

Tamil Nadu Chennai Board TN SSLC Model Paper 2023, Blueprint Kalvisolai Government Of Tamil Nadu Formed A New Board by Merging the Board Of Secondary Education And Board Of Higher Secondary Examinations 2023,-2023,,TN SSLC Previous Paper 2023 TN SSLC Model Paper 2023, Directorate of Government Examination is Conduct the SSLC Examination Month of March to April 2023, TN SSLC Model Paper 2023, Tamil Nadu 10th Sample Questions Paper 2023,


登录 *


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