`
xinlingwuyu
  • 浏览: 138739 次
  • 性别: 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编码

分享到:
评论

相关推荐

    Ajax传参是乱码解决方案

    本文将详细介绍几种常见的解决Ajax传参乱码的方法,并通过具体的示例代码来帮助大家理解和掌握。 #### 一、理解乱码产生的原因 在讨论解决方案之前,我们需要先了解乱码产生的根本原因。乱码通常是因为字符编码不...

    乱码问题终极解决方案

    本篇文章将针对"乱码问题终极解决方案"这个主题,深入探讨在Java、JSP和Ajax中如何有效地预防和解决乱码问题。 首先,我们要理解乱码产生的原因。乱码通常是因为字符编码不一致导致的,比如文件编码、程序内部编码...

    JAVA 乱码问题集合

    在Java编程中,乱码问题是一个常见的困扰,尤其是在处理字符编码时。以下是一些关键的知识点,可以帮助理解和解决Java中的乱码问题。 首先,我们需要理解字符...通过了解这些知识点,可以有效地避免和解决乱码问题。

    extjs 前后台交互参数出现中文乱码问题的解决方法

    通过上述方法,我们可以有效地解决在使用ExtJS进行Ajax同步请求时,中文参数出现乱码的问题。关键是保证前后端编码的一致性,以及正确地使用编码与解码函数。此外,还可以考虑在服务器端配置文件中设置统一的字符集...

    jsp中 ajax的get请求的中文乱码问题的解决方法.docx

    在开发Web应用时,我们经常会遇到中文乱码问题,...通过以上步骤,可以有效地解决JSP中使用AJAX进行GET请求时的中文乱码问题。在开发过程中,保持良好的编码规范和对字符编码的理解,能帮助开发者更好地避免这类问题。

    使用prototype.js发送ajax get请求中文参数乱码解决

    综上所述,解决`prototype.js`发送Ajax GET请求中文参数乱码问题的关键在于确保客户端、服务器和传输过程中的编码一致性。这包括设置请求头、服务器配置以及HTML页面的字符集声明。在实际开发中,理解并处理这些细节...

    json 中文乱码解决方案

    本文将详细介绍如何解决JSON中的中文乱码问题,并提供几种简单实用的方法来帮助开发者避免这类问题的发生。 #### 一、问题背景与原因分析 在Web开发中,前后端之间传递的数据格式往往采用JSON(JavaScript Object ...

    AJAX编码问题

    通过以上方法,我们可以有效地解决AJAX请求中的乱码问题,提高应用程序的稳定性和用户体验。开发者应该根据实际情况选择合适的解决方案,以确保数据能够在客户端和服务端之间正确传输。 总之,理解和掌握AJAX编码...

    magicajax0.3.0解决中文乱码

    《解决magicajax0.3.0中的中文乱码问题》 在进行Web开发时,我们经常需要使用Ajax技术来实现页面的异步更新,而MagicAjax作为一款强大的Ajax库,为开发者提供了便捷的接口和丰富的功能。然而,在处理中文字符时,...

    ajax+jsp+servlet 中文解决方法

    在这个"ajax+jsp+servlet 中文解决方法"的示例中,开发者遇到了在使用Ajax进行数据交互时中文乱码的问题。中文乱码通常是由字符编码不一致导致的,特别是在跨平台或跨浏览器通信时。以下是一些关于如何解决这个问题...

    j2ee21:ajax01:get提交、post提交(完成用户名搜索),两者的区别(中文乱码问题、缓存问题)

    在这个教程中,我们将深入探讨AJAX的GET和POST提交方式,以及它们在实现用户名搜索功能时的区别,同时也会解决可能出现的中文乱码问题和缓存问题。 首先,GET和POST是HTTP协议中的两种主要请求方法,它们在AJAX中...

    java开发乱码问题处理大全

    本文将深入探讨Java开发中常见的乱码问题及其解决策略,帮助你迅速掌握处理乱码的技巧,提升开发效率。 #### 一、统一字符集编码 首先,确保系统和Java环境的字符集编码统一至关重要。默认情况下,Java使用的是UTF...

    highchats_乱码解决方案

    **解决乱码的策略** 1. **统一编码**:确保HTML页面、JavaScript代码以及数据源都使用相同的字符编码,通常是UTF-8。在HTML头部添加`&lt;meta charset="UTF-8"&gt;`来设定页面编码。 2. **设置Highcharts的lang属性**:...

    PHP WEB 开发乱码问题总结

    ### PHP WEB 开发乱码问题总结 在进行PHP Web开发时,编码问题一直是开发者们头疼的一个环节,尤其是在处理中文或多种语言的情况下。...希望这篇文章能帮助大家在实际开发中有效避免和解决乱码问题。

    ajax

    **Ajax(Asynchronous JavaScript and XML)**是一种在无需...通过以上分析,我们可以了解到Ajax的核心概念、工作原理以及解决中文乱码问题的方法。在实际开发中,结合各种工具和库,可以更高效地实现网页的异步交互。

    Jquery乱码的一次解决过程 图解教程

    因此,要解决乱码问题,首先要确定数据发送和接收时所使用的编码是否一致。 2. 环境设置: 本次案例的环境是*** 2003,一个早期的开发环境。在这样的旧平台上开发时,经常容易出现编码问题,因为早期的环境可能...

    java版 解决跨域问题CORS ajax+jsonp例子源代码.zip

    6. "ajax发来的数据,java(servlet)收到的是乱码" - 这可能是一个问题描述,指出在使用AJAX发送数据到Java Servlet时,服务器接收到的数据出现乱码,可能涉及到字符编码的问题,需要正确配置字符集以避免这种情况。...

    解决ASP.NET中的各种乱码问题总结

    本篇总结将围绕这些问题展开详细讨论,帮助开发者理解和解决乱码问题。 首先,***页面显示乱码问题经常会导致用户在浏览网站时遇到难以阅读的信息。此类问题一般与web.config中的配置及文件编码有关。在web.config...

    Ajax版本的工作搜索引擎.rar

    `[XML]XMLHTTP 乱码 的解决方法-编程-冷酷空间 - 陈正伟 - blog_czw_name.mht`文件可能讲述了在使用XMLHTTP(现在通常称为XMLHttpRequest)对象进行Ajax请求时遇到的字符编码问题及其解决方案。这对于确保从服务器...

    appfuse学习笔记(三)解决乱码和菜单设置

    在本篇“appfuse学习笔记(三)解决乱码和菜单设置”中,我们将深入探讨在使用AppFuse框架时遇到的编码问题以及如何定制应用程序的菜单。AppFuse是一款开源项目,它提供了一个快速开发Web应用的基础,特别是对于Java...

Global site tag (gtag.js) - Google Analytics