`
xinlingwuyu
  • 浏览: 136225 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ajax解决乱码问题帮助文件

阅读更多

转:解决AJAX传送中文会导致乱码的问题

关键字: AJAX,中文,乱码

解决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):
/////////////////////////////////////////////////////////////////////////////////////
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%String path = request.getContextPath();%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>AJAX提交页面</title>
 <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
   <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>
  </head> 
  <body>
  <input type="button" value="提交" onclick="justdo()"/>
   </body>
</html>
/////////////////////////////////////////////////////////////////////////////////////
  ajax请求处理页面(act.jsp)的内容如下:
/////////////////////////////////////////////////////////////////////////////////////
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%String path = request.getContextPath();%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@page import="java.net.URLDecoder"%>
<html>
  <head>
    <title>ajax deal</title>
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="cache-control" content="no-cache">
 <meta http-equiv="expires" content="0">   
  </head>
  <body>
  <%
  //遍历输出参数内容。
  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);
  }
   %>
  </body>
</html>
/////////////////////////////////////////////////////////////////////////////////////
  分析:当调用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

<title>AJAX使用cookie传值例子</title>
<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      http://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>

<body>
AJAX使用cookie传值例子:<br/>
<form name=myform>
name:<input id=name  value="变量名甚至可以是中文" size=20><br/>
value:<input type=text size=20 id=val value=这里><br/>
<input onclick="getXML()" type="button" value="送出数据">
<input onclick="if(xh && xh.responseText) {alert(xh.responseText);}" type="button" value="显示返回结果"><br/>
<div id=m bgcolor=blue>在此显示状态</div>
<input type=button onclick="alert(document.cookie)" value=显示本地COOKIE>
</form>

服务器端代码 a.php

<?
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程序中加入<%Response.Charset = "GB2312"%>即解决了这个问题。
同样在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编码

分享到:
评论

相关推荐

    开发一个驾校学员管理系统的详细步骤,帮助初学者完成简单的系统开发

    10. 使用过滤器统一解决乱码 11. 使用监听器注销JDBC驱动 12. 实现系统功能模块 实现管理员登录 实现学员信息列表 实现添加学生信息 实现删除学生信息 实现修改学员信息 实现数据报表展示 实现文件上传导入 五. 开发...

    SugarCRM6.5.17的中文包(兼容6.5.X)

    2.已解决:模块生成器-&gt;文件包-&gt; 可用子面板-&gt;默认,点开后无内容(而英文下无此问题); 3.中文下,日历的日期与星期几可能不对应的问题; 4.更新翻译,让其更加易懂。 5.相关翻译人员:木子飞飞 (rell336@126.com)...

    DotNetTextBox V6.0.10 商业版 下载 (已知最新)

    6)增加AjaxSupport目录,使用此目录的文件覆盖原版同名文件后重新编译即可解决在Asp.Net Ajax UpdatePanel下工作不正常的BUG!(不需要使用asp.net ajax的用户无需覆盖此目录的文件) 7)增加asp.net ajax的演示例子...

    java web技术开发大全(最全最新)

    4.7.3 实例:解决服务端程序读取中文请求消息的乱码问题 4.7.4 实例:用AJAX技术发送和接收中文信息 4.7.5 实例:在请求消息头和响应消息头中转输中文 4.8 小结 第5章 JSP技术 5.1 用MyEclipse编写第一个...

    SugarCRM6.5.x中文包

    2.已解决:模块生成器-&gt;文件包-&gt; 可用子面板-&gt;默认,点开后无内容(而英文下无此问题); 3.中文下,日历的日期与星期几可能不对应的问题; 4.更新翻译,让其更加易懂。 5.相关翻译人员:木子飞飞 (rell336@126.com)...

    java web开发技术大全

    4.7.3 实例:解决服务端程序读取中文请求消息的乱码问题 4.7.4 实例:用AJAX技术发送和接收中文信息 4.7.5 实例:在请求消息头和响应消息头中转输中文 4.8 小结 第5章 JSP技术 5.1 用MyEclipse编写第...

    asp.net知识库

    帮助解决网页和JS文件中的中文编码问题的小工具 慎用const关键字 装箱,拆箱以及反射 动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个...

    商用版本文本编辑器DotNetTextBoxV6.0.8Source 源码

    2)更新编辑器帮助文件。 3)文字水印调整为只添加到图像宽高&gt;100像素的图片上面,并且调整编辑器默认配置添加的是图片水印! 2010/04/02 Version 6.1.6 For VS2005/2008 Updates: 1)针对IIS6.0文件解析高危漏洞...

    建筑工程公司网站 v2013

    对客户使用中遇到的问题,您可以随时联系非凡建站系统的客服,我们会实时为您提供帮助! 个性化定制服务:如果您对本站制作好的成品网站模板不是很满意,需要有独特风格或功能的网站模板,我们可以为您提供全面的...

    蓝色博客网站源码官方下载 v2013

    对客户使用中遇到的问题,您可以随时联系非凡建站系统的客服,我们会实时为您提供帮助! 个性化定制服务:如果您对本站制作好的成品网站模板不是很满意,需要有独特风格或功能的网站模板,我们可以为您提供全面的...

    集团公司网站 v2013

    对客户使用中遇到的问题,您可以随时联系非凡建站系统的客服,我们会实时为您提供帮助! 个性化定制服务:如果您对本站制作好的成品网站模板不是很满意,需要有独特风格或功能的网站模板,我们可以为您提供全面的...

Global site tag (gtag.js) - Google Analytics