CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Web 开发 >  Ajax

XMLHTTP 异步获取的时 HTML 页面,有中文会乱码,如何用 JS 对 responsebody 进行编码转换获取GB2312文本?

楼主changechange(http://access911.net 是我的个人网站,欢迎光临)2006-03-09 13:07:21 在 Web 开发 / Ajax 提问

XMLHTTP   异步获取的时   HTML   页面,有中文会乱码,如何用   JS   对   responsebody   进行编码转换获取GB2312文本?  
   
  网络上都是用   VBS   客户端完成的,难道   JS   不能完成么? 问题点数:20、回复次数:34Top

1 楼meizz(梅花雪)回复于 2006-03-09 13:34:22 得分 0

取   responseText   ,要取的目标页面编码另存为UTF-8格式Top

2 楼emu(月亮不在手指尖上)回复于 2006-03-09 14:12:21 得分 0

《XMLHTTP   乱码   的解决方法》在网上转载很多啦,比如   http://blog.czw.name/archives/60.html  
   
  一般是用vbscript转码,因为纯javascript只能用字典法转码。但是在繁体中文系统下vbs也转不出来gbk码,可以参考   http://www.blogjava.net/emu/articles/31756.html   的字典法转码。Top

3 楼Octer()回复于 2006-03-09 15:42:46 得分 0

楼上的各位,如果你的应用服务器在linux下,不知道能否解决楼主的问题,     比如用户的浏览器  
  是mozilla  
  我也正为此郁闷呢  
   
  Top

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

用responseText接收数据,而不是用responsebody  
  responsebody得到的是二进制数据,js无法直接处理  
  原来可用adodb.stream处理,但打过补丁的ie就不能了。况且adodb.stream也不是什么环境都有的  
   
  其实只要服务器端返回的是utf-8编码的数据就不会乱码了  
  如果觉得在服务器端转码太麻烦,那么也只需要先返回一个声明语言类型的头(meta标记)Top

5 楼changechange(http://access911.net 是我的个人网站,欢迎光临)回复于 2006-03-09 20:59:11 得分 0

我是要回写数据到   GB2312的页面中,不可能直接把   UTF-8   的文本显示在   GB2312的页面中Top

6 楼changechange(http://access911.net 是我的个人网站,欢迎光临)回复于 2006-03-09 21:05:26 得分 0

那继续问下去,如果我在服务器上发送数据的时候直接用   VBS   的   ASC   对所有字符编码  
   
  for   i   =   1   to   len(strWords)  
          strReturn   =   strReturn   &   ","   &   asc(mid(strWords,i,1))  
  next  
   
  然后将这个   strReturn   返回给客户端   JS   处理,能恢复出原来的数据么?  
  也就是   JS   有没有类似   VBS   SPLIT   以及   CHR   的函数?Top

7 楼emu(月亮不在手指尖上)回复于 2006-03-09 21:19:21 得分 0

xuzuning(唠叨)    
  试验过responsebody是可以直接进行解码处理的。  
   
  >>我是要回写数据到   GB2312的页面中,不可能直接把   UTF-8   的文本显示在   GB2312的页面中  
   
  网上有很多编码规则的资料,先做好自己的功课,搞清楚自己要做的每个步骤应该是什么编码,才知道需要做什么转换。  
   
  >>如果我在服务器上发送数据的时候直接用   VBS   的   ASC   对所有字符编码  
  服务器应该不需要做这个编码。我介绍的文章里面明明白白的说是浏览器端编码,怎么不好好看就一个劲“继续问下去”?  
   
  >>也就是   JS   有没有类似   VBS   SPLIT   以及   CHR   的函数?  
  查下javascript手册就知道了,做好自己的功课吧。  
   
  Top

8 楼changechange(http://access911.net 是我的个人网站,欢迎光临)回复于 2006-03-09 23:27:18 得分 0

>>我是要回写数据到   GB2312的页面中,不可能直接把   UTF-8   的文本显示在   GB2312的页面中  
   
  网上有很多编码规则的资料,先做好自己的功课,搞清楚自己要做的每个步骤应该是什么编码,才知道需要做什么转换。-------有资料么?我去   GOOGLE   用“编码”查了,由于太多,无法确定你说的是哪种类型,请给出地址,谢谢!  
   
   
   
  >>如果我在服务器上发送数据的时候直接用   VBS   的   ASC   对所有字符编码  
  服务器应该不需要做这个编码。我介绍的文章里面明明白白的说是浏览器端编码,怎么不好好看就一个劲“继续问下去”?--------------你已经明确说明   JS   不能做编码转换,但是我现在必须在客户端用JS   获取服务器端返回的“GB2312中文字符”,所以我只能另想方法。  
   
   
  >>也就是   JS   有没有类似   VBS   SPLIT   以及   CHR   的函数?  
  查下javascript手册就知道了,做好自己的功课吧。---------我翻过了,没找到,如果你知道可以提示我是哪个字符,如果你不知道就直接说“不知道”  
   
   
  Top

9 楼meizz(梅花雪)回复于 2006-03-09 23:43:32 得分 0

每个人对你的贴子的回复,都是对你的贴子的关心,不论良莠。且据我所知   emu   能算得上是国内   AJAX   界顶尖的人物之一。很多问题不能是让别人代劳,应该说是一点一拔即通。  
          JS没有对二进制解码的系统函数,这方面不如VBS,因为VBS里有   ASCB   LEFTB   RIGHTB   LENB   之类的一系列针对二进制的系统函数  
          在客户端对二进制转码已经有很多这方面的函数或解决方案,你也不用到别的地方去找,你只要在ASP版或者JS版的FAQ里找就够多了。  
          在JS版头些天万常华大哥还刚发过一个用JS解决编码的贴子,不要抱怨,多份讨论的心Top

10 楼emu(月亮不在手指尖上)回复于 2006-03-10 01:08:19 得分 20

呵呵,我都说“搞清楚自己要做的每个步骤应该是什么编码,才知道需要做什么转换”了嘛,需要那种编码类型是你要做的决定,而不是你要去google出答案的问题。关键不是你要搞清楚怎么编码转换,而是要搞清楚你需要什么编码。  
  比如说,你打算整个网站所有页面和保存到数据库的数据都用utf-8编码,那么恭喜恭喜,web世界中utf-8是最受欢迎的编码方式,你应该不大会需要做多余的编码。  
  但是假如你的整个网站的页面和数据库保存的数据、web服务器处理的数据都用gbk(gb2312,gb18030)编码,那么你的服务程序向浏览器发送数据的时候就要注意了,你需要正确的声明你的xml声明中的encoding,浏览器才能替你正确的解码,因此你也不能使用AjaH方式简单的返回字符串后在浏览器端处理responseText或者responseBody,除非你打算自己做解码。  
  这还好说。如果你试图从浏览器向服务器发送数据,更加需要小心了。如果你打算用get方式发送少量的汉字数据,可以直接把汉字作为参数值拼到url后面,这样浏览器可以根据页面的编码设定来编码汉字。如果你打算post比较多的数据,那么当你吧汉字放到send(data)中的时候会自动被浏览器按照utf-8编码,你连声明编码方式的机会都没有,因此你可以在服务器端做utf-8解码后重新编码成gbk处理和保存,也可以在浏览器端用vbscript获得汉字gbk编码后按照urlencode方式把汉字当成二进制数据送进xmlhttp,这样服务器就不需要多于的解码了。  
  这是我能做的最详细的解释了,但是我很怀疑你是不是被我说晕了@-@。  
   
  >>你已经明确说明   JS   不能做编码转换,但是我现在必须在客户端用JS   获取服务器端返回的“GB2312中文字符”  
  我从来没有说过JS不能做编码转换,我的原话是“一般是用vbscript转码,因为纯javascript只能用字典法转码。但是在繁体中文系统下vbs也转不出来gbk码,可以参考   http://www.blogjava.net/emu/articles/31756.html   的字典法转码。”  
  也就是说,你可以用vbs获得gbk编码,也可以在我给出的地址上找到我写的纯js做gbk编码的脚本。此外用fromCharCode还可以轻易获得unicode编码,当然我们也常用escape来做。  
  而且如果你服务器端返回的是GB2312中文字符,只需要把你的数据包装成合法的xml格式之后在xml声明中声明     encoding="GB2312"   就可以了。这个帖子就是用gb2312(其实是gbk了)编码的xml生成的,在浏览器上查看一下这个帖子的页面源码你就会得到一个很标准的示范:  
   
  <?xml   version="1.0"   encoding="GB2312"?>  
   
   
  >>也就是   JS   有没有类似   VBS   SPLIT   以及   CHR   的函数?  
  请查String对象的方法就可以了。这是字符串处理,当然应该在String对象上查了,很难想到吗?Top

11 楼changechange(http://access911.net 是我的个人网站,欢迎光临)回复于 2006-03-10 08:51:56 得分 0

楼上的回答非常详细,谢谢  
   
  但还有不明白的方法  
  那么你的服务程序向浏览器发送数据的时候就要注意了,你需要正确的声明你的xml声明中的encoding,--------如果我从服务器向客户端发送的不是一个完整的   XML   文档,而是1千到2千字节的   HTML   的GB2312的文本,是否也要设置   ENCODING   ?如何设置?  
   
   
  >>也就是   JS   有没有类似   VBS   SPLIT   以及   CHR   的函数?  
  请查String对象的方法就可以了。这是字符串处理,当然应该在String对象上查了,很难想到吗?---------------STRING   我已经看过了,由于我是做   VBA   的,JS   不熟悉,虽然看了帮助把所有的   STRING   方法全看了一遍,但仍然不清楚到底是哪个方法有用。  
  比如   SPLIT   也许就不能实现。是否能够通过正则来一个一个匹配然后再处理呢?  
  '123,11,223,'   我返回给客户端的文本应该类似前面这样的  
  Top

12 楼emu(月亮不在手指尖上)回复于 2006-03-10 09:31:32 得分 0

1   我不明白为什么一定要用纯html和文本,用xml包装一下很麻烦吗?害怕html被转义大可以用cdata包装一下啊。  
   
  2   你真的查了javascript的String的参考吗?看看这下面有没有split呢?有没有类似chr的函数呢?  
   
  属性  
  constructor   属性   |   length   属性   |   prototype   属性  
   
  方法  
  anchor   方法   |   big   方法   |   blink   方法   |   bold   方法   |   charAt   方法   |   charCodeAt   方法   |   concat   方法   |   fixed   方法   |   fontcolor   方法   |   fontsize   方法   |   fromCharCode   方法   |   indexOf   方法   |   italics   方法   |   lastIndexOf   方法   |   link   方法   |   match   方法   |   replace   方法   |   search   方法   |   slice   方法   |   small   方法   |   split   方法   |   strike   方法   |   sub   方法   |   substr   方法   |   substring   方法   |   sup   方法   |   toLowerCase   方法   |   toUpperCase   方法   |   toString   方法   |   valueOf   方法  
   
  要求  
  版本   1  
   
  请参阅  
  new   运算符  
  Top

13 楼changechange(http://access911.net 是我的个人网站,欢迎光临)回复于 2006-03-10 10:58:34 得分 0

也就是说你的建议是直接包装为   XML   返回,然后在客户端用   responseXML   以及   XML   DOM   做操作咯?Top

14 楼changechange(http://access911.net 是我的个人网站,欢迎光临)回复于 2006-03-10 11:04:27 得分 0

我另外开了个贴子,emu(月亮不在手指尖上)     去拿分  
  http://community.csdn.net/Expert/topic/4605/4605317.xml?temp=.5056269Top

15 楼mingxuan3000(铭轩)回复于 2006-03-10 13:45:11 得分 0

markTop

16 楼rollenc(rollenc)回复于 2006-03-19 15:50:18 得分 0

MARKTop

17 楼kindma(乐米)回复于 2006-03-20 09:54:24 得分 0

用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");  
   
  这个小问题居然困挠一家人好长时间!Top

18 楼yjgx007(还不结帖?!听妈妈的话! http://www.geekclaw.com)回复于 2006-03-20 17:14:34 得分 0

又是字符编码问题,唉!Top

19 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2006-03-21 01:02:08 得分 0

JS   escape()   unescape()  
  C#   Server.UriEcode()   Server.UriDecode()Top

20 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2006-03-21 01:04:59 得分 0

我的办法在英文版系统上都好用。Top

21 楼you34(蚊子)回复于 2006-03-31 15:13:17 得分 0

请楼主公布解决办法,谢谢......Top

22 楼lwter(滔滔不绝)回复于 2006-04-01 11:55:30 得分 0

我尝试过用xml传输,我的XML格式如下:  
  <?xml   version="1.0"   encoding="gb2312">  
  <content>  
    中文字  
  </content>  
   
  返回的数据在gb2312页面显示,在firefox正常,但在IE就是一团乱码?  
   
  很闷呀!  
  Top

23 楼epjack(笨蛋一个)回复于 2006-04-04 01:07:06 得分 0

最简单的,返回responseXML.xmlTop

24 楼dongfei(风月无影)回复于 2006-04-15 11:15:11 得分 0

markTop

25 楼gq(游子)回复于 2006-04-25 14:02:26 得分 0

学习。。碰上了该问题。Top

26 楼linxhome()回复于 2006-05-03 14:26:59 得分 0

估计是没人帮解决了的Top

27 楼zhouzhenxin(寒心月)回复于 2006-05-03 18:43:01 得分 0

我在jsp页面上设置了contentType="text/html;charset=gb2312"  
   
  我总结了一下ajax乱码问题.主要有三个地方.  
  1.传入中文参数时乱码  
  解决.string   value   =   new   String(in.getByte("iso8859-1"),"gb2312");  
  注意,这里只能用gb2312   or   GBK  
   
  2.输出中文乱码  
  解决contentType="text/html;charset=gb2312"  
  注意,如果你设response.setCharEncoding="gb2312"没有用.  
   
  3.大文本传输时中文乱码  
  解决string   value   =   new   String(in.getByte("iso8859-1"),"UTF-8");  
  注意,只能用UTF-8才能正确显示  
   
  只对j2ee有用.请各位指教Top

28 楼xiehuiqi(谢)回复于 2006-05-05 09:47:11 得分 0

vbs可以和js混用  
  在js里面可以调用vbs里面的函数  
  用vbs解码,js调用是可以实现的  
  ------------------------------  
  还有一种方法是对汉字进行两次escape  
  然后取的时候进行两次unescape即可  
  Top

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

markTop

30 楼xiongzai(熊仔)回复于 2006-05-08 01:30:22 得分 0

在这里,非常感谢zhouzhenxin(寒心月)  
  搞了一晚的问题终于解决了……Top

31 楼zhouzhenxin(寒心月)回复于 2006-05-09 15:34:34 得分 0

老大,问题解决了又不给分。  
  55555555555555555555555555Top

32 楼yushulingfeng(跑不快)回复于 2006-05-09 16:05:10 得分 0

在ASP.NET中应用AJAX时解决中文乱码问题很简单.  
  只要在WEB.CONFIG中设置:请求UTF-8     响应GB2312  
  就OK了.哈哈,其他系统就不知道了.Top

33 楼xiehuiqi(谢)回复于 2006-05-09 16:13:02 得分 0

呵呵,谢谢寒心月Top

34 楼spacener(空中楼阁)回复于 2006-05-10 23:14:49 得分 0

http://www.topee.cn/  
  刚完成的!  
   
  交流  
  Top

相关问题

  • 关于xmlhttp异步方式回调的问题
  • 如何用客户端vbscript异步调用xmlhttp?
  • 关于xmlhttp异步获取数据的问题。
  • 异步!!!
  • XMLHTTP迷惑问题之三:同步和异步的实质区别和用途上的差异?
  • 通过xmlhttp异步获取的的数据,如何被别的函数调用呢
  • (Ajax相关)多个异步XMLHTTP操作,如何判断前面的已经执行完成
  • 使用xmlhttp异步获取数据造成网页反应迟钝,如何解决
  • 用xmlhttp将html的数据打包成multipart/form-data格式,实现异步上传文件功能
  • 用xmlhttp将html的数据打包成multipart/form-data格式,实现异步上传文件功能

关键词

  • .net
  • 编码
  • 页面
  • 乱码
  • 函数
  • 数据
  • 服务器
  • js
  • 转换
  • 文本

得分解答快速导航

  • 帖主:changechange
  • emu

相关链接

  • Web开发类图书

广告也精彩

反馈

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