`
莫生气
  • 浏览: 866261 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

转:解决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中文乱码问题的成因,并提供一系列解决方案。 **一、问题原因** 1. **编码格式不一致**:服务器与客户端(浏览器)之间使用的字符编码格式不同,例如服务器使用GBK编码,而浏览器使用UTF-8编码...

    php+AJAX传送中文会导致乱码的问题的解决方法

    在Web开发中,PHP与AJAX的...当使用AJAX发送POST请求时,如果直接将包含中文字符的变量(如`val`)作为请求参数,可能会因为编码问题导致乱码。例如以下代码: ```javascript http_request.open("POST", url, true); ...

    Ajax中文乱码问题解决方法

    本文将深入探讨Ajax中文乱码问题的原因及其解决方案。 首先,我们需要理解Ajax乱码的根源。当JavaScript发送HTTP请求时,如果服务器和客户端之间关于字符编码的约定不一致,就会导致乱码。常见的原因包括: 1. **...

    jquery+asp ajax 中文乱码问题解决文档

    ### jQuery + ASP AJAX 中文乱码问题解决方案 在开发基于jQuery和ASP的Web应用程序时,中文乱码问题可能成为困扰开发者的一大难题。特别是在使用Ajax进行前后端数据交互时,中文字符可能会出现乱码现象,影响用户...

    ajax乱码解决方案

    总的来说,解决Ajax乱码问题的关键在于理解字符编码的工作原理,确保数据在整个传输过程中的编码与解码一致性,以及正确设置服务器和客户端的编码设置。在实际应用中,还应考虑跨平台和跨浏览器的兼容性,以确保解决...

    Ajax 中文乱码问题

    本文将详细探讨如何解决Ajax请求过程中的中文乱码问题,并提供具体的解决方案。 #### 二、问题分析 在使用Ajax进行数据传输时,中文乱码问题通常出现在以下两个环节: 1. **发送表单数据时中文乱码**:当通过Ajax...

    ajax提交中文乱码解决方法

    ### AJAX提交中文乱码解决方法 在Web开发中,AJAX(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。它通过JavaScript发起异步请求,与服务器进行数据交换,从而...

    ajax传递中文参数乱码解决办法

    ### AJAX传递中文参数乱码解决办法 在Web开发过程中,数据传输是不可或缺的一部分,而AJAX作为一种无需重新加载整个页面的情况下就能与服务器交换数据的技术,被广泛应用于动态数据交互场景中。然而,在处理中文等...

    ajax中文乱码如何解决

    针对Ajax中文乱码问题,这里提出一个解决方案,这个方案在作者的开发环境中(XP, Eclipse, GB18030编码)已经成功解决了问题: 1. **设置请求头**: 在发送POST请求前,需要设置Content-Type头,告诉服务器数据的...

    ajax提交,后台中文乱码解决

    然而,在进行Ajax提交时,如果前后端的编码设置不一致,很容易导致中文字符显示为乱码。本文将基于提供的文件信息,详细解析两种解决Ajax提交后台取值中文乱码的方法。 ### 方法一:使用URL编码 在第一个示例中,...

    ajax get请求中文参数乱码解决

    在进行Web开发时,我们经常会遇到Ajax GET请求发送中文参数时出现乱码的问题。这个问题主要源于HTTP协议在处理非ASCII字符时的编码不一致。在本文中,我们将深入探讨这个问题,以及如何通过不同的方法来解决它。 ...

    java认证_Ajax中文乱码问题及解决方法.doc

    【Java认证:Ajax中文乱码问题及解决方法】 在Java Web开发中,使用Ajax进行异步数据交互时,经常会遇到中文乱码的问题。这主要涉及到字符编码的处理,特别是当Ajax请求发送的数据包含中文字符时。以下是两种常见的...

    解决ajax乱码和页面传值问题

    一、解决Ajax乱码问题 Ajax发送和接收数据时,乱码问题主要出现在两个环节:发送请求时的数据编码和服务器返回数据的解码。以下是解决乱码的关键步骤: 1. 数据编码:在发送Ajax请求前,确保你的数据已经正确编码...

    Struts框架下Ajax发送中文乱码问题的解决

    在实际应用中,我们常常会遇到Ajax与服务器交互时出现中文乱码的问题,尤其是在发送和接收中文数据时。这个问题主要涉及到字符编码的处理,解决起来需要对HTTP协议、字符编码原理以及Struts框架的工作机制有一定的...

    ajax到servlet乱码解决

    在 Web 开发中,使用 AJAX 通过 URL 传参数给 Servlet 时,经常会遇到乱码问题,即使使用了统一的字符编码也没用。下面我们来探讨这个问题的解决方案。 问题描述 当我们使用 AJAX 通过 URL 传参数给 Servlet 时,...

    Ajax FireFox IE 乱码兼容问题

    在IT领域,特别是Web开发中,字符编码的处理是一大挑战,尤其是在跨浏览器、跨平台的环境下,如在Ajax请求中遇到的FireFox与IE之间的乱码兼容问题。本文将深入探讨这一问题,并提供详细的解决方案。 ### Ajax与字符...

    ajax解决中文乱码(java/jsp)

    在Web开发中,尤其是在使用Java与JSP技术栈进行开发时,经常会遇到的一个问题是:如何处理AJAX请求中的中文字符乱码问题。本篇文章将详细介绍如何通过前端编码处理、后端参数接收以及响应头设置等手段来有效解决这一...

    c# ajax post数据乱码解决

    在开发过程中,尤其是在使用C#与ASP.NET进行Web开发时,经常会遇到客户端通过Ajax向服务器端发送Post请求后,服务器端接收到的数据出现乱码的问题。这种情况不仅影响用户体验,也可能会导致程序逻辑出现问题。本文将...

    struts中文乱码问题解决详细步骤

    解决这个问题通常涉及到编码设置的调整,下面将详细介绍两种方法来解决Struts中的中文乱码问题。 **方法一:配置Filter** 1. **添加过滤器**:首先,我们需要在Web应用的`web.xml`文件中添加一个`...

Global site tag (gtag.js) - Google Analytics