ajax中文乱码解决 [转]


<script type="text/JavaScript"> alimama_pid="mm_10809884_1047205_2744758"; alimama_titlecolor="0000FF"; alimama_descolor ="000000"; alimama_bgcolor="FFFFFF"; alimama_bordercolor="E6E6E6"; alimama_linkcolor="008000"; alimama_bottomcolor="FFFFFF"; alimama_anglesize="4"; alimama_bgpic="2"; alimama_icon="1"; alimama_sizecode="16"; alimama_width=658; alimama_height=60; alimama_type=2; </script> <script src="http://a.alimama.cn/inf.js" type=text/javascript> </script>

<script type="text/JavaScript"> alimama_pid="mm_10809884_1047205_2744795"; alimama_titlecolor="0000FF"; alimama_descolor ="000000"; alimama_bgcolor="FFFFFF"; alimama_bordercolor="E6E6E6"; alimama_linkcolor="008000"; alimama_bottomcolor="FFFFFF"; alimama_anglesize="4"; alimama_bgpic="2"; alimama_icon="1"; alimama_sizecode="16"; alimama_width=658; alimama_height=60; alimama_type=2; </script> <script src="http://a.alimama.cn/inf.js" type=text/javascript> </script>

导读:
  <script type=text/javascript> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript> </script>
 解决AJAX传送中文会导致乱码的问题
  
  
  //如果传送参数是直接赋予的,就会产生乱码!
  
  http_request.open("POST",url,true);
  
  
  http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  
  
  http_request.send("action="+strName+"&val="+val); //如果val的值为中文,则产生乱码
  
  
  
  //解决方法很简单:使用javascript中的escape(string) 函数
  
  http_request.open("POST",url,true);
  
  
  http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  
  
  http_request.send("action="+strName+"&val="+escape(val)); //val的值为中文不会产生乱码
   关于在AJAX中GET回的ResponseText中文乱码的最简解决办法
  
  用AJAX来GET回一个页面时,RESPONSETEXT里面的中文多半会出现乱码,这是因为xmlhttp在处理返回的responseText的时候,是把resposeBody按UTF-8编码进解码考形成的,如果服务器送出的确实是UTF-8的数据流的时候汉字会正确显示,而送出了GBK编码流的时候就乱了。解决的办法就是在送出的流里面加一个HEADER,指明送出的是什么编码流,这样XMLHTTP就不会乱搞了。
  PHP:header('Content-Type:text/html;charset=GB2312');
  ASP:Response.Charset("GB2312")
  JSP:response.setHeader("Charset","GB2312");
  =======================================================
  
  
  /***********本人原创,欢迎转载,转载请保留本人信息*************/
  作者:王力猛 (wallimn)
  电邮:wallimn@sohu.com
  博客:http://wallimn.bokee.com
  时间:2006-11-15
  /***********本人原创,欢迎转载,转载请保留本人信息*************/
  今天终于解决了AJAX的中文乱码问题,写篇文章来帮助一下有同样问题的朋友们。我的开发环境:XP, eclipse,使用GB18030编码。
  当遇到这个问题时,到网上去查了好多文章,提到几种解决方案,如:全站UTF-8编码;请求头编码为中文;使用javascript中的escape函数。
  使用GET方式提交数据的时候,中文问题很好解决,setrequestheader("Content-Type","text/html; encoding=gb18030")就可以了。但这个方法在POST方式中却不起作用。大家都知道GET方式提交数据有长度限制,有时我们必须使用POST方式来提交数据。
  但对于POST方式,使用上述的几种方法经过多次测试,问题依旧。我郁闷了好几天。
  今天把问题解决了,很简单,是使用escape(或encodeURI,两个函数javascript的函数,功能基本相同,可以查一下相关的帮助),但要使用两次,这是解决问题的关键。
  我的例子涉及两个页面,一个是初始页面,一个是AJAX请求处理页面。
  初始页面内容如下(hello.jsp):
  /
  
  
  
  
  
  

   <script type=text/javascript>
  function justdo(){
  var post="name=王力猛&email=wallimn@sohu.com&bokee=http://wallimn.bokee.com";
  post = encodeURI(post);
  post = encodeURI(post);//两次,很关键
  var xmlObj = new ActiveXObject('Msxml2.XMLHTTP');
  var URL = '<%= path%>/page/act.jsp';//文件名需要调整成测试时的相应位置?
  xmlObj.open ('post',URL,true);
  xmlObj.setrequestheader("cache-control","no-cache");
  xmlObj.setrequestheader("Content-Type","application/x-www-form-urlencoded");
  xmlObj.send (post);//注意:POST方式,使用这个来发送内容?
  }
  </script>
  
  
  
  
  
  /
  ajax请求处理页面(act.jsp)的内容如下:
  /
  
  
  
  
  
  
  



  
  
     //遍历输出参数内容。

  for (Enumeration e = request.getParameterNames(); e.hasMoreElements();) {

  String h = (String) e.nextElement();

  String v = request.getParameter(h);

  String mm = java.net.URLDecoder.decode(v, "UTF-8");

  System.out.println("请求参数: "+ h + "= "+ mm);

  }

  %>
  
  
  /
  分析:当调用request.getParameter()函数时,会自动进行一次URI的解码过程,调用时内置的解码过程会导致乱码出现。而URI编码两次后,request.getParameter()函数得到的是原信息URI编码一次的内容。再用可控的解码函数java.net.URLDecoder.decode()就可解出原始的正确的信息。
  以上分析纯属个人看法,不知是否正确。
  
  
  用过AJAX的朋友肯定知道javascript是使用UTF-8国际编码,即每个汉字用4个字节来存储,但是这就造成了用AJAX来send数据的时候出现乱码。
  有一种解决办法就是使用encodeURIComponent加上修改 Content-Type 为 application/x-www-form-urlencoded" 来把数据统一编码成 url 格式,当然,也可以指定编码,如:“application/x-www-form-urlencoded; charset=utf-8 ”,例子:http_request = new ActiveXObject("Msxml2.XMLHTTP"); http_request.setrequestheader("content-type","application/x-www-form-urlencoded; charset=utf-8");
  另一种方法就是通过vbscript 的写的函数把数据转成gb2312格式的,我个人觉得这种方法比较好。有兴趣的朋友可以到网上去查一下。
  也可以在js发送数据之前用escape函数把data转换为16进制的字符串,用js读取数据的时候再用unescape转换回来就ok了。
  今天突发奇想,AJAX调用的时候会不会发送cookie 呢?马上写了一个程序测试一下,果然能,这样就可以在调用ajax之前,先把数据通过javascript写到cookie里,然后再send就可以将cookie里的数据发送出去了,太爽了!!
  演示地址:http://cn5.cn/ajax/ajax12.htm
  客户端代码 ajax.htm
  
   <script>
  var oDiv
  var xh
  function getXML()
  {
  setcookie($('name').value,$('val').value);
  oDiv = document.all.m
  oDiv.innerHTML = "正在装载,请稍侯......."
  oDiv.style.display= ""
  xh = new ActiveXObject("Microsoft.XMLHTTP")
  xh.onreadystatechange = getReady
  xh.open("POST","a.php",false)
  xh.send();
  }
  function getReady()
  {
  if(xh.readyState==4)
  {
  if(xh.status==200)
  {
  oDiv.innerHTML = "完成"
  }
  else
  {
  oDiv.innerHTML = "抱歉,装载数据失败。原因:" + xh.statusText
  }
  }
  } //author : longbill www.longbill.cn
  function setcookie(name,value)
  {
  var cookiestr=name+"="+value+";";
  var expires = "";
  var cookieexp=60*60*1000;
  var d = new Date();
  d.setTime( d.getTime() + cookieexp);
  expires = "expires=" + d.toGMTString()+";";
  document.cookie = cookiestr+ expires;
  }
  function $(a)
  {
  return document.getElementById(a);
  }
  </script>
  
  AJAX使用cookie传值例子:


  name:

  value:

  
  

在此显示状态

  

  服务器端代码 a.php
  
header("Content-type: text/html;charset=GB2312");
echo "以下是您送出的所有COOKIE变量及其值/n";
print_r($_COOKIE);
?>  header("Content-type: text/html;charset=GB2312");
  echo "以下是您送出的所有COOKIE变量及其值/n";
  print_r($_COOKIE);
  >
  ----------------
  第一,javascript沿用java的字符处理方式,内部是使用unicode来处理所有字符的,
  第二,utf-8是每个汉字(unicode字符)用3个字节来存储。
  第三,用utf-8来send数据是不会出现乱码的,是后台程序没有正确解码才会出现乱码。
  第四,ajax发送数据的时候如果修改 Content-Type 为 application/x-www-form-urlencoded",肯定是用post方式,而“太大的数据往往会出错”是用GET方式发送数据造成的。
  第五,用vbscript写的函数是用来把数据转成gbk编码(操作系统默认的编码方式。如果在繁体系统上就是big5之类的编码)的,而不是gb2312,两者的编码字符数量相差3倍左右。
  第六,用cookie来发送数据,一是很容易溢出,二是要不停的擦屁股,否则cookie里面的数据在每个http请求(包括图片和脚本请求)中都会被发送。三是并发几个http请求的时候,没有办法指定那个cookie是要发送给那个http请求的。
  ------------------------
  用AJAX来GET回一个页面时,RESPONSETEXT里面的中文多半会出现乱码,这是因为xmlhttp在处理返回的responseText的时候,是把resposeBody按UTF-8编码进解码考形成的,如果服务器送出的确实是UTF-8的数据流的时候汉字会正确显示,而送出了GBK编码流的时候就乱了。解决的办法就是在送出的流里面加一个HEADER,指明送出的是什么编码流,这样XMLHTTP就不会乱搞了。
  PHP:header('Content-Type:text/html;charset=GB2312');
  ASP:Response.Charset("GB2312")
  JSP:response.setHeader("Charset","GB2312");
  
  
  使用ajax获取服务器数据返回给客户端,出现中文乱码。在之前的一个ajax应用中指定codepage=936,将所有页面编码都指定为GB2312即可解决。
  这次的应用中却无起作用了,经过多次的试验,客服端的编码应该绝对没有问题的。可以判断问题一定出在服务器端。稍微分析一下可知虽然服务器端指定了文件的编码格式,但对于服务器输出流就成为了怀疑的对象。由于使用MS SQL2000,采用unicode编码,所以返回数据给客户端将会出现unicode编码的中文在gb2312编码页面显示的问题。于是在服务器端输出流加一个HEADER:
  ASP程序中加入 即解决了这个问题。
  同样在php和jsp程序中的书写类似
  PHP:header('Content-Type:text/html;charset=GB2312');
  JSP:response.setHeader("Charset","GB2312");
  ajax产生乱码的原因整理如下
  1、xtmlhttp 返回的数据默认的字符编码是utf-8,如果客户端页面是gb2312或者其它编码数据就会产生乱码
  2、post方法提交数据默认的字符编码是utf-8,如果服务器端是gb2312或其他编码数据就会产生乱码
  解决办法有:
  1、若客户端是gb2312编码,则在服务器指定输出流编码
  2、服务器端和客户端都使用utf-8编码

本文转自
http://hi.baidu.com/sihillver/blog/item/f74c06d8380b2c3533fa1c18.html
<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
QQ书签 新浪ViVi 365Key网摘 天极网摘 spurl 百度收藏 Google书签 diglog Del.icio.us digg 雅虎收藏 Windows Live网摘 收藏到〖就喜欢〗网络收藏夹
<script type="text/JavaScript"> alimama_pid="mm_10809884_1047205_2744946"; alimama_titlecolor="0000FF"; alimama_descolor ="000000"; alimama_bgcolor="FFFFFF"; alimama_bordercolor="E6E6E6"; alimama_linkcolor="008000"; alimama_bottomcolor="FFFFFF"; alimama_anglesize="8"; alimama_bgpic="0"; alimama_icon="0"; alimama_sizecode="16"; alimama_width=658; alimama_height=60; alimama_type=2; </script> <script src="http://a.alimama.cn/inf.js" type=text/javascript> </script>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值