CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Web 开发 >  Ajax

我用AJAX POST数据时,汉字出现乱码,怎么解决

楼主andy0618(自己选的路跪着也要走完)2006-03-03 15:04:17 在 Web 开发 / Ajax 提问

我用AJAX     POST数据时,汉字出现乱码,怎么解决 问题点数:20、回复次数:37Top

1 楼chinahuman(铁匠)回复于 2006-03-03 15:09:17 得分 0

应该是设置一下你的XML的编码就可以搞定了吧?把UTF-8改成GB2312Top

2 楼andy0618(自己选的路跪着也要走完)回复于 2006-03-03 15:56:24 得分 0

我是得到的responseTextTop

3 楼andy0618(自己选的路跪着也要走完)回复于 2006-03-03 15:56:49 得分 0

你们难道没有遇到过这样的问题吗,奇怪Top

4 楼chinahuman(铁匠)回复于 2006-03-03 16:00:23 得分 5

指的是你得到的返回值?responseText  
  两三年前我也碰到过,怎么解决我倒是忘了。不过告诉你一个我现在想出来的方法就是先把它urlencode,到客户端后再decode肯定没有这个问题了Top

5 楼chinahuman(铁匠)回复于 2006-03-03 16:02:22 得分 0

帮你搜索了一下:http://beenhero.com/这个里面有你要的内容,我的网络太差了,看不到里面的具体东西。  
  其中有一个方法就是我上面说的:)Top

6 楼jasonboy(骑着小猪看夕阳)回复于 2006-03-03 16:54:44 得分 0

返回页面escape  
   
  接收页面unescape  
  Top

7 楼andy0618(自己选的路跪着也要走完)回复于 2006-03-03 17:31:00 得分 0

接收页面接收到参数后就要存入数据库了  
  JS的unescape方法用不上了Top

8 楼andy0618(自己选的路跪着也要走完)回复于 2006-03-03 17:43:15 得分 0

我在用JSP在接收AJAX   POST方式传递的参数时汉字出现乱码Top

9 楼orrin(orrin)回复于 2006-03-04 10:22:12 得分 0

有一个简单的办法,就是在请求路径中加一个随机参数,就不会能中文乱码问题了,根本彻底的解决方法是在apache中进行配置,具体方法忘记了。Top

10 楼orrin(orrin)回复于 2006-03-04 10:22:58 得分 0

晕,这好像是asp版,IIS不知道如何配置。Top

11 楼emu(月亮不在手指尖上)回复于 2006-03-06 00:42:49 得分 5

用AJAX     POST数据,是不能指定编码格式的,只能用utf-8,所以第一建议是前后台都统一用utf-8.  
  如果不能改变编码格式,就只能手工编码,把汉字用gbk编码后用urlencode方式发送出去。通常我们用vbscript做gbk编码(呵呵也就是Asc()啦),但是受到的限制是非IE浏览器不支持vbscript,而且在繁体中文系统下vbscript编码的结果似乎是big-5编码。  
  为了兼容繁体系统和非IE浏览器,也可以用javascript做gbk编码,这样基本上就要用字典法来编码了,因为unicode和gbk之间似乎没有简单的函数关系。javascript做gbk编码的方法可以参考我写的   http://www.blogjava.net/emu/articles/31756.html  
  用escape/unescape也是可以考虑的方法,不过要注意escape的结果和urlencode的结果一样是用“%”作为转义符的,因此escape的结果如果要按照字符串形式接收的话“%”需要重新编码。Top

12 楼keanfly(fly)回复于 2006-03-06 09:17:30 得分 0

var   city   =   f.username.value;                                         //document.getElementById("username").value;  
      var   state=   f.userpass.value;                                                               //document.getElementById("userpass").value;  
      //document.form1.userpass.value=city;  
      var   url   =   "./TestAjaxSub.jsp?username="   +   city+"&userpass="+state;     //对应于Get  
  -------------------------------------------------------------修改上述几个地方。然后在TestAjaxSub.jsp中按照JSP通常解决中文乱码的方式来解决。我测试过了,正常。  
  Top

13 楼kill8108(日月之光)回复于 2006-03-07 16:30:25 得分 0

在post前,设定一下编码为utf-d,到服务器上同时设置一下编码,这样就可以了呢!  
   
  emu(回到csdn)   (   )   信誉:177   这种方法也是常见的呢!Top

14 楼cds27(http://blog.csdn.net/cds27/)回复于 2006-03-08 11:20:26 得分 0

发送的时候用xml   dom发送,接收的时候用xml   dom接受,返回继续用xml   dom。  
  全程用xml就不会有编码问题了。Top

15 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2006-03-08 11:40:49 得分 0

Decode一下?Top

16 楼xuzuning(唠叨)回复于 2006-03-08 16:09:43 得分 0

xmlhttp总是用utf-8编码发送数据的,你需要在服务器端做转码处理。  
  Top

17 楼Scarroot(每天一贴,把分用完.)回复于 2006-03-08 16:22:46 得分 0

markTop

18 楼youys(youys)回复于 2006-03-08 21:59:09 得分 0

我是这样解决的,我把每一个HTML文件或ASP文件都以UTF-8保存,当在文件内容说明也用UTF-8.在发送的参数前都用escape()就行了,没有任何问题。同时在IE,FIREFOX中都行,不在自己进行编码的转换。Top

19 楼hax(海曦)回复于 2006-03-09 02:09:07 得分 5

补充emu等同志的:  
   
  1.   首先,基本上所有浏览器都是按照rfc等标准,优先考虑服务器端发送的content-type中所指定的encoding的,所以如果你要从服务器取得内容,尽量在服务器端指定好content-type。在这方面,Apache做的非常好。其默认设置上会为xxx.gb发送gb2312的头,为xxx.utf8发送utf-8的头,为xxx.big5发送big5的头。你甚至可以直接访问xxx,Apache会自动为浏览器选取最合适的版本发送。如果你使用Servlet/JSP开发,则使用Filter也可以非常简单的做到同样的事情。相对来说,IIS/ASP就很困难,ASP.NET应该有方法,但我不熟悉它,有熟悉的同志可作补充。  
   
  2.   浏览器发送信息方面,笼统的说,参数会根据该页面本身的编码进行url编码(变成形如%xx%xx的形式)。细节如下,当网页编码是unicode时(utf-8或utf-16),一律采用utf-8并url编码发送。否则:FireFox根据网页的content-type所指定的编码对网页中的链接进行url编码;表单方面,FF支持html规范所规定的form上accept-charset属性,会根据该属性的第一个可用的编码进行编码,若无该参数则根据网页的content-type所指定的编码进行url编码。MS   IE不支持accept-charset,仅根据网页的content-type所指定的编码对网页中的表单进行url编码;对于链接的url(不包含query部分)默认始终以utf-8进行url编码,但链接的query部分则不进行url编码直接以原始字节发送。正是这样不一致的行为造成很多麻烦。  
   
  3.   XMLHttpRequest发送时,你应该用encodeURI和encodeURIComponent方法对参数进行编码,这两个js函数始终使用utf-8进行编码。若不编码就传递的情况如何我没有测试过。  
   
  4.   BCP   最佳实践的建议  
  a.   静态文件绝对不要用中文文件名,因为在不同操作系统上的不同server处理都不一样,而且可能存在bug(如iis)。  
  b.   html、css和js尽量采用带有BOM的utf-8。这样统一使用utf-8是最佳选择。  
  c.   所有链接不应直接写中文,而应直接写成encodeURI之后的样子。  
  d.   凡是涉及中文的表单,假如在一个非unicode的页面中,如果不是约定(如某个站点统一使用gb2312),则提交的时候最好以各种方式加上encoding的提示。例如加入额外的http头(如果可能的话),附带一个enc参数,提交到一个特别的地址(如xxx.action.gb)。。。总之给服务器端以提示。Top

20 楼mingxuan3000(铭轩)回复于 2006-03-09 08:41:11 得分 0

markTop

21 楼emu(月亮不在手指尖上)回复于 2006-03-10 01:26:47 得分 2

>>但链接的query部分则不进行url编码直接以原始字节发送  
  汉字没有所谓的“原始字节”哦,始终都需要以某中方式编码存在的。在javascript中默认的编码方式应该是unicode(fromCharCode和escape的输出都是)。  
  query部分发送的时候如果没有编码,似乎浏览器会按照页面当前的编码方式进行urlencode编码成%xxTop

22 楼emu(月亮不在手指尖上)回复于 2006-03-10 01:28:48 得分 0

注意到楼主在二楼就说了“我是得到的responseText”呵呵,原来和标题说的是两回事啊。  
  把文字内容用xml包装起来,声明一下encoding为正确的编码方式,浏览器应该可以解析得出来的。Top

23 楼hax(海曦)回复于 2006-03-10 02:41:46 得分 1

我指的原始字节是指IE对于链接的query部分(通过网页链接或者直接在浏览器地址栏输入)是不进行任何urlencode的,即发送的并不是%xx。web   server收到的就是未经任何处理的字节,如果网页是gb的,则收到的就是gb编码的字节,如果网页是utf-8则收到的就是utf8编码的字节,如果是从地址栏直接输入,则是系统默认编码即gb的字节。至少在我的XP   IE6上是如此。这种处理方式其实很奇怪,按理说是违背HTTP协议标准的,不过多数server还是能接收的。Top

24 楼waterboy(流水男孩)回复于 2006-03-11 14:23:05 得分 0

>>emu(月亮不在手指尖上)  
  用AJAX   POST数据,是不能指定编码格式的,只能用utf-8,所以第一建议是前后台都统一用utf-8.  
   
  ---   req.xmlHttpRequest.setRequestHeader('Content-type',   'application/x-www-form-urlencoded;charset=GB2312');Top

25 楼afoskoo(暂停打印)回复于 2006-03-11 15:26:09 得分 1

按照顺序,open   调用完毕之后要调用send   方法。send   的参数如果是以Post   方式发出的  
  话,可以是任何想传给服务器的内容。不过,跟form   一样,如果要传文件或者Post   内容给  
  服务器,必须先调用setRequestHeader   方法,修改MIME   类别。如下:  
  http_request.setRequestHeader(“Content-Type”,”application/x-www-form-urlencoded”);  
  这时资料则以查询字符串的形式列出,作为sned   的参数,例如:  
  name=value&anothername=othervalue&so=onTop

26 楼wujunsong(宇豪)回复于 2006-03-11 19:24:45 得分 1

'用途:UTF-8编码和GB2312编码互转ASP代码,兼容英文和数字    
   
  function   gb2utf(szInput)  
          Dim   wch,   uch,   szRet  
          Dim   x  
          Dim   nAsc,   nAsc2,   nAsc3  
           
          If   szInput   =   ""   Then  
                  unic   =   szInput  
                  Exit   Function  
          End   If  
          For   x   =   1   To   Len(szInput)  
                  wch   =   Mid(szInput,   x,   1)  
                  nAsc   =   AscW(wch)  
                  If   nAsc   <   0   Then   nAsc   =   nAsc   +   65536  
           
                  If   (nAsc   And   &HFF80)   =   0   Then  
                          szRet   =   szRet   &   wch  
                  Else  
                          If   (nAsc   And   &HF000)   =   0   Then  
                                  uch   =   "%"   &   Hex(((nAsc   \   2   ^   6))   Or   &HC0)   &   Hex(nAsc   And   &H3F   Or   &H80)  
                                  szRet   =   szRet   &   uch  
                          Else  
                                  uch   =   "%"   &   Hex((nAsc   \   2   ^   12)   Or   &HE0)   &   "%"   &   _  
                                                          Hex((nAsc   \   2   ^   6)   And   &H3F   Or   &H80)   &   "%"   &   _  
                                                          Hex(nAsc   And   &H3F   Or   &H80)  
                                  szRet   =   szRet   &   uch  
                          End   If  
                  End   If  
          Next  
                   
          gb2utf   =   szRet  
  end   function  
   
   
  function   utf2gb(UTFStr)    
  for   Dig=1   to   len(UTFStr)    
  if   mid(UTFStr,Dig,1)="%"   then    
  if   len(UTFStr)   >=   Dig+8   then    
  GBStr=GBStr   &   ConvChinese(mid(UTFStr,Dig,9))    
  Dig=Dig+8    
  else    
  GBStr=GBStr   &   mid(UTFStr,Dig,1)    
  end   if    
  else    
  GBStr=GBStr   &   mid(UTFStr,Dig,1)    
  end   if    
  next    
  utf2gb=GBStr    
  end   function    
   
  function   ConvChinese(x)    
  A=split(mid(x,2),"%")    
  i=0    
  j=0    
   
  for   i=0   to   ubound(A)    
  A(i)=c16to2(A(i))    
  next    
   
  for   i=0   to   ubound(A)-1    
  DigS=instr(A(i),"0")    
  Unicode=""    
  for   j=1   to   DigS-1    
  if   j=1   then    
  A(i)=right(A(i),len(A(i))-DigS)    
  Unicode=Unicode   &   A(i)    
  else    
  i=i+1    
  A(i)=right(A(i),len(A(i))-2)    
  Unicode=Unicode   &   A(i)    
  end   if    
  next    
   
  if   len(c2to16(Unicode))=4   then    
  ConvChinese=ConvChinese   &   chrw(int("&H"   &   c2to16(Unicode)))    
  else    
  ConvChinese=ConvChinese   &   chr(int("&H"   &   c2to16(Unicode)))    
  end   if    
  next    
  end   function    
   
  function   c2to16(x)    
  i=1    
  for   i=1   to   len(x)   step   4    
  c2to16=c2to16   &   hex(c2to10(mid(x,i,4)))    
  next    
  end   function    
   
  function   c2to10(x)    
  c2to10=0    
  if   x="0"   then   exit   function    
  i=0    
  for   i=   0   to   len(x)   -1    
  if   mid(x,len(x)-i,1)="1"   then   c2to10=c2to10+2^(i)    
  next    
  end   function    
   
  function   c16to2(x)    
  i=0    
  for   i=1   to   len(trim(x))    
  tempstr=   c10to2(cint(int("&h"   &   mid(x,i,1))))    
  do   while   len(tempstr)<4    
  tempstr="0"   &   tempstr    
  loop    
  c16to2=c16to2   &   tempstr    
  next    
  end   function    
   
  function   c10to2(x)    
  mysign=sgn(x)    
  x=abs(x)    
  DigS=1    
  do    
  if   x<2^DigS   then    
  exit   do    
  else    
  DigS=DigS+1    
  end   if    
  loop    
  tempnum=x    
   
  i=0    
  for   i=DigS   to   1   step-1    
  if   tempnum>=2^(i-1)   then    
  tempnum=tempnum-2^(i-1)    
  c10to2=c10to2   &   "1"    
  else    
  c10to2=c10to2   &   "0"    
  end   if    
  next    
  if   mysign=-1   then   c10to2="-"   &   c10to2    
  end   functionTop

27 楼wujunsong(宇豪)回复于 2006-03-11 19:36:01 得分 0

然后在javascript中调用,如:  
  //客户端响应鼠标双击事件    
  function   myRowDblClicked(grid,ev)  
  {      
      var   GName   =   "张三";  
      GName     =   gb2utf(GName);    
      window.location='StockState.aspx?SName='+   GName;  
  }  
   
  StockState页面接收时  
  后台用:  
  txtGoodName.Text   =   System.Web.HttpUtility.UrlDecode(Request["GName"].ToString());  
         
  Top

28 楼sage6437()回复于 2006-03-12 16:29:59 得分 0

xmlObj.open   ('POST',   url,   true);  
  xmlObj.setRequestHeader("Content-Type",   "application/x-www-form-urlencoded");  
  xmlObj.send   (file);  
  看看是否有第二句?  
  xmlObj.setRequestHeader("Content-Type",   "application/x-www-form-urlencoded");Top

29 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2006-03-12 19:40:55 得分 0

用JS   escape一下数据,再用C#   Server.UrlDecode搞一下Top

30 楼emu(月亮不在手指尖上)回复于 2006-03-13 17:13:01 得分 0

waterboy(流水男孩):  
   
  再次做试验确认了   setRequestHeader('Content-type',   'application/x-www-form-urlencoded;charset=GB2312');     确实无法改变XMLHTTP发送数据时候的编码方式。Top

31 楼SaRoot(新风机)回复于 2006-03-14 11:03:38 得分 0

我是这样读数据的,没有出现乱码,而且也带中文  
   
  //读出用户传入的xml字符串  
  System.IO.Stream   stream   =   Request.InputStream;  
  System.IO.BinaryReader   br   =   new   System.IO.BinaryReader(stream,   System.Text.Encoding.Default);  
  int   len   =   int.Parse(stream.Length.ToString());  
  byte[]   b   =   br.ReadBytes(len);Top

32 楼liangsx(liangsx)回复于 2006-03-15 08:36:37 得分 0

asp文件是加Response.CharSet="gb2312"Top

33 楼dearmite(笨笨的我*_^)回复于 2006-03-15 10:54:25 得分 0

终于也有一个人碰到和我一样的问题了。  
  呵呵,  
  上面写什么只是设页页为GR2312的全没试过。  
  问题出在JS在传递汉字的时候,就已经是乱码。  
  很多WEB服务器本身设定一下就可以,  
   
  比如TOMCAT,JBOSS,WEBLOGIC,  
  等等,  
   
  但是我在APACHE下就不行。  
  等正解Top

34 楼hqulyc((vc++++++++...死循环了))回复于 2006-03-15 11:10:27 得分 0

responseText得到的字符编码是你Apache和php   ini文件中的字符编码设定的一样.  
  如apache中的编码设定为gb2312,那么responseText的编码也为gb2312  
  eg:DefaultChatset   gb2312.  
   
  我倒是没试过将Apache和php   ini中的默认编码各设定为不同的编码,看得到的编码会是哪个设定的  
  Top

35 楼hqulyc((vc++++++++...死循环了))回复于 2006-03-15 11:11:26 得分 0

至于页面设定为GR2312,那只是页面浏览字符的方式.Top

36 楼wjh6of6agriculture(艰苦奋斗)回复于 2006-05-28 15:16:17 得分 0

谢谢wujunsong(宇豪)   老大!我刚接触AJAX,把你的函数拷过去就搞定了。。。。。Top

37 楼Scarroot(每天一贴,把分用完.)回复于 2006-05-29 22:04:23 得分 0

markTop

相关问题

  • 汉字乱码问题,急!!!
  • Cookie 汉字乱码问题
  • RichEditCtrl 中输入汉字出现乱码 ?
  • 显示汉字乱码问题?
  • 使用visiBroker,汉字变乱码。
  • 为何汉字会变成乱码??
  • java汉字显示乱码问题??
  • 按钮上汉字是乱码
  • 我的汉字显示乱码,
  • 关于XML汉字乱码问题?

关键词

  • 编码
  • 乱码
  • 汉字
  • 页面
  • 网页
  • 服务器
  • 数据
  • 浏览器
  • 解决
  • 文件

得分解答快速导航

  • 帖主:andy0618
  • chinahuman
  • emu
  • hax
  • emu
  • hax
  • afoskoo
  • wujunsong

相关链接

  • Web开发类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo