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

xml抓取页面源代码,得到的结果是乱码。。。

楼主aiiiq(外星人木有小JJ)2006-03-16 17:56:44 在 Web 开发 / JavaScript 提问

xml抓取页面源代码,得到的结果是乱码。。。  
   
  <script>  
  var   req   =   new   ActiveXObject('MSXML2.XMLHTTP');  
  req.open('GET',   'http://www.baidu.com/s?wd=123',   false);  
  req.send(null);  
  document.write('<textarea   cols=120   rows=30>'   +   req.responsetext   +   '</textarea>');  
  </script>  
   
   
   
  用vbs写的一点反应都没有  
   
  <SCRIPT   language="VBScript">  
  oReq   =   CreateObject("MSXML2.XMLHTTP")  
  oReq.open   "GET","http://www.baidu.com/s?wd=123",false  
  oReq.send  
  alert   oReq.responseText  
  </SCRIPT>  
  问题点数:100、回复次数:7Top

1 楼patchclass(黑翼)回复于 2006-03-16 18:37:20 得分 5

哈哈,老问题了,用vbs在客户端   用midb等函数可以完美解决  
  用js需要用stream对象来转换编码,xmlhttp默认的编码是utf-8Top

2 楼patchclass(黑翼)回复于 2006-03-16 18:38:26 得分 5

转贴如下  
   
  以前我曾经贴过一篇用XMLHTTP   Post   Form   的帖子,那里的代码中我Post   E文的Value毫无问题,但是后来发现Post含有中文的表单时会出现乱码,原因当然是UTF-8   和GB2312   之间的转换问题了!TNND,打倒GB2312!大家都用UTF8多好。  
   
  用XMLHTTP   Post   Form时的表单乱码有两方面的原因——Post表单数据时中文乱码;服务器Response被XMLHTTP不正确编码引起的乱码。换句话说,本文主要解决两个问题——怎样正确Post中文内容&怎样正确显示得到的中文内容。  
   
  Part   I   Post中文内容  
   
  先看看E文的表单是怎么提交的:  
   
  <SCRIPT   language="JavaScript">  
  strA   =   "submit1=Submit&text1=scsdfsd";  
  var   oReq   =   new   ActiveXObject("MSXML2.XMLHTTP");  
  oReq.open("POST","http://ServerName/VDir/TstResult.asp",false);  
  oReq.setRequestHeader("Content-Length",strA.length);      
  oReq.setRequestHeader("CONTENT-TYPE","application/x-www-form-urlencoded");  
  oReq.send(strA);  
  </ScRIPT>  
   
  如果把strA   =   "submit1=Submit&text1=scsdfsd";换成:  
  strA   =   "submit1=Submit&text1=中文";  
   
  你会发现提交上去的东东根本不对,ASP中Request.Form("Text1")根本取不到值。俺用Request.BinaryRead把一个HTML   Form中的Post内容写出来看了看,才发现问题——Form提交时也要编码的,编码后的中文是类似于%??%??的转义字符,比如“中文”就被编码为:%D6%D0%CE%C4。呵呵,也怪俺笨,人家CONTENT-TYPE里明明写的清清楚楚——application/x-www-form-urlencoded,urlencoded嘛当然就是这个样子了。既然这样,那我们也知道该怎么办了——自己做转换,代码见下:  
   
  <SCRIPT   language="VBScript">  
  Function   URLEncoding(vstrIn)  
          strReturn   =   ""  
          For   i   =   1   To   Len(vstrIn)  
                  ThisChr   =   Mid(vStrIn,i,1)  
                  If   Abs(Asc(ThisChr))   <   &HFF   Then  
                          strReturn   =   strReturn   &   ThisChr  
                  Else  
                          innerCode   =   Asc(ThisChr)  
                          If   innerCode   <   0   Then  
                                  innerCode   =   innerCode   +   &H10000  
                          End   If  
                          Hight8   =   (innerCode     And   &HFF00)\   &HFF  
                          Low8   =   innerCode   And   &HFF  
                          strReturn   =   strReturn   &   "%"   &   Hex(Hight8)   &     "%"   &   Hex(Low8)  
                  End   If  
          Next  
          URLEncoding   =   strReturn  
  End   Function  
   
  strA   =   URLEncoding("submit1=Submit&text1=中文")  
  oReq   =   CreateObject("MSXML2.XMLHTTP")  
  oReq.open   "POST","http://ServerName/VDir/TstResult.asp",false  
  oReq.setRequestHeader   "Content-Length",Len(strA)  
  oReq.setRequestHeader   "CONTENT-TYPE","application/x-www-form-urlencoded"  
  oReq.send   strA  
  </ScRIPT>  
   
  (在这里俺把前面的JavaScript的代码改成了VBScript,不是吃饱了撑的没事干,原因见后)  
   
  Part   II.正确显示得到的中文内容  
   
  OK,如果你在Server端把Form的内容写到数据库/文件的话,你在那里看到的中文毫无问题,但是,假如你想看看Server的Response——问题来了:如果Response的结果不是XML,XMLHTTP.responseXML里当然是不会有东东的,那就用responseText好了,在代码的最后加一句:  
   
  alert(oReq.responseText)  
  看看俺们辛勤劳动的结果     :P  
   
  但是但是.....怎么所有的中文全变成了方格?   (我打不出来,有兴趣自己去试,也不用Post,Get一个含有中文的网页就可以发现了。)  
   
  原因很简单:XMLHTTP得到Response时假定Response是UTF8编码的,如果Response是XML,那还可以通过encoding来指定编码,但HTML就不行了。(见鬼的GB2312,再次打倒!)所以它把含GB2312编码的HTML当成UTF8格式,不出错才有鬼!  
   
  不过好在还有补救的办法:XMLHTTP的responseBody   属性里包含的可是未解码的Resonse——"a   raw   undecoded   bytes   as   received   directly   from   the   server"   :),唯一的问题是,responseBody返回的是一个unsigned   bytes数组,我们怎么去访问它,怎么把它转换成BSTR?  
   
  这就是为什么我在上面把代码改成VBScript的原因——VBScript   Can   do   it,but   JavaScript   Cannot!  
   
  代码见下:  
  <SCRIPT   language="VBScript">  
  Function   URLEncoding(vstrIn)  
          strReturn   =   ""  
          For   i   =   1   To   Len(vstrIn)  
                  ThisChr   =   Mid(vStrIn,i,1)  
                  If   Abs(Asc(ThisChr))   <   &HFF   Then  
                          strReturn   =   strReturn   &   ThisChr  
                  Else  
                          innerCode   =   Asc(ThisChr)  
                          If   innerCode   <   0   Then  
                                  innerCode   =   innerCode   +   &H10000  
                          End   If  
                          Hight8   =   (innerCode     And   &HFF00)\   &HFF  
                          Low8   =   innerCode   And   &HFF  
                          strReturn   =   strReturn   &   "%"   &   Hex(Hight8)   &     "%"   &   Hex(Low8)  
                  End   If  
          Next  
          URLEncoding   =   strReturn  
  End   Function  
   
  Function   bytes2BSTR(vIn)  
          strReturn   =   ""  
          For   i   =   1   To   LenB(vIn)  
                  ThisCharCode   =   AscB(MidB(vIn,i,1))  
                  If   ThisCharCode   <   &H80   Then  
                          strReturn   =   strReturn   &   Chr(ThisCharCode)  
                  Else  
                          NextCharCode   =   AscB(MidB(vIn,i+1,1))  
                          strReturn   =   strReturn   &   Chr(CLng(ThisCharCode)   *   &H100   +   CInt(NextCharCode))  
                          i   =   i   +   1  
                  End   If  
          Next  
          bytes2BSTR   =   strReturn  
  End   Function  
   
  strA   =   URLEncoding("submit1=Submit&text1=中文")  
  oReq   =   CreateObject("MSXML2.XMLHTTP")  
  oReq.open   "POST","http://ServerName/VDir/TstResult.asp",false  
  oReq.setRequestHeader   "Content-Length",Len(strA)  
  oReq.setRequestHeader   "CONTENT-TYPE","application/x-www-form-urlencoded"  
  oReq.send   strA  
  alert   bytes2BSTR(oReq.responseBody)  
  </ScRIPT>  
   
  嘿嘿,是不是很简单啊,用这个再试试看?一切OK!  
   
  (顺便说说byte(),这个东东在VBScript里的表现只能用妖来形容——对它调用VarType   返回8209——vbArray   +   vbByte,用LBound、UBound能拿到数组的上界下界,但是就是不能用name(i)的形式访问,搞得我以为在Script里根本没法处理这种类型,在bytes2BSTR函数里可以看到我是把它当成String来处理的——LenB/MidB什么的,发现这点纯属意外——我开始往这个函数里传的是XMLHTTP.responseText,想一个Byte一个Byte地看看里面到底有点什么,后来一时性起把responseText改成responseBody,结果就中奖了,哈哈)  
   
  最后的废话:  
  1、以上代码在MSXML   Parser   3   Release+VBScript   5.5环境下通过。那位兄弟有早一点版本的Script可以帮我试试看能不能成。  
  2、一直以为JavaScript   vs   VBScript应该是JavaScript略好,所以有时候想彻底抛弃VBScript,ASP   Server/Client统统用JavaScript,看来未必是个好主意。    
   
  Top

3 楼aiiiq(外星人木有小JJ)回复于 2006-03-16 19:08:40 得分 0

先谢谢!  
   
  我看的就是上面的文章,关键是vsb取不到responseText的东西,搞不明白。  
   
  js的stream对象,应该用adodb.stream吧,以前是可以的,但在ie6sp2好象不好用了。  
   
  请高人帮忙!  
   
  以前使用的代码:  
  function   loadContent(strURL)  
  {  
  var   strContent   =   "";  
  if   (typeof   strURL   !=   "string"   ||   strURL   ==   "")return   strContent;  
  try  
  {  
  var   oProxy   =   new   ActiveXObject("Microsoft.XMLHTTP");  
   
  oProxy["Open"]("GET",   strURL,   false);  
  oProxy["Send"]();  
  /// strContent   =   oProxy["responseText"];   //get   Text   html  
  strContent   =   oProxy["responseBody"];   //get   Bin   html,   and   then   change2text  
  }  
  catch(e){status   =   e.description}  
  return   strContent;  
  }  
   
  function   bytes2bstr(vin)  
  {  
  var   st   =   new   ActiveXObject("adodb.stream")  
  with   (st){  
  Type   =   2   //var   adTypeBinary   =   1;   var   adTypeText   =   2  
  Open()  
  WriteText(vin)  
  Position   =   0  
  Charset   =   "GB2312"  
  Position   =   2  
  return   ReadText  
  }  
  }  
  Top

4 楼aiiiq(外星人木有小JJ)回复于 2006-03-16 19:40:38 得分 0

刚才测试了adodb.stream在ie6sp1中没问题,ie6sp2就不行了。  
   
  vbscript又调试不成功,哎。。。  
   
   
   
   
  <script>  
   
  str   =   loadContent('http://www.baidu.com/s?wd=123');  
   
  document.write("<textarea   cols=120   rows=30>"   +   (bytes2bstr(str))   +   "</textarea>");  
   
  function   loadContent(strURL)  
  {  
  var   strContent   =   "";  
  if   (typeof   strURL   !=   "string"   ||   strURL   ==   "")return   strContent;  
  try  
  {  
  var   oProxy   =   new   ActiveXObject("Microsoft.XMLHTTP");  
   
  oProxy["Open"]("GET",   strURL,   false);  
  oProxy["Send"]();  
  /*  
  strContent   =   oProxy["responseText"];   //get   Text   html  
  */  
  strContent   =   oProxy["responseBody"];   //get   Bin   html,   and   then   change2text  
  }  
  catch(e){status   =   e.description}  
  return   strContent;  
  }  
   
  function   bytes2bstr(vin)  
  {  
  var   st   =   new   ActiveXObject("adodb.stream")  
  with   (st){  
  Type   =   2   //var   adTypeBinary   =   1;   var   adTypeText   =   2  
  Open()  
  WriteText(vin)  
  Position   =   0  
  Charset   =   "GB2312"  
  Position   =   2  
  return   ReadText  
  }  
  }  
  </script>Top

5 楼s1ihome(My hometown is a beautiful village)回复于 2006-03-17 11:18:41 得分 10

vbs那个你需要Set   oReq=....  
   
  然后可以用vbs的这个function把乱码转换一下  
  Function   bytes2BSTR(vIn)  
          strReturn   =   ""  
          For   i   =   1   To   LenB(vIn)  
                  ThisCharCode   =   AscB(MidB(vIn,i,1))  
                  If   ThisCharCode   <   &H80   Then  
                          strReturn   =   strReturn   &   Chr(ThisCharCode)  
                  Else  
                          NextCharCode   =   AscB(MidB(vIn,i+1,1))  
                          strReturn   =   strReturn   &   Chr(CLng(ThisCharCode)   *   &H100   +   CInt(NextCharCode))  
                          i   =   i   +   1  
                  End   If  
          Next  
          bytes2BSTR   =   strReturn  
  End   Function  
  Top

6 楼aiiiq(外星人木有小JJ)回复于 2006-03-17 12:29:34 得分 0

'vbs那个你需要Set   oReq=....'  
   
  不明白,能说详细点吗?Top

7 楼s1ihome(My hometown is a beautiful village)回复于 2006-03-17 18:00:24 得分 80

Set   oReq   =   CreateObject("MSXML2.XMLHTTP")  
  Top

相关问题

  • asp源代码象是乱码
  • Internet Transfer源代码UTF-8乱码问题
  • 达人救命! jbuilderX源代码中文乱码
  • vb的源代码 中文注释 怎么拷进Word里都是乱码啊
  • 我在一些地方下载的asp源代码都是乱码
  • 100分跪求:抓取当前窗口的DLL或将数据窗口保存为BMP的源代码
  • 请问,哪儿有操作xml数据的源代码??
  • 谁能让我下一些XML的源代码?
  • 恳求例子(源代码!) java 读xml 文件。
  • XML处理网页源代码的解决方案

关键词

  • 乱码
  • 编码
  • 代码
  • 中文
  • 转换
  • 函数
  • vbscript
  • 内容
  • oproxy
  • 表单

得分解答快速导航

  • 帖主:aiiiq
  • patchclass
  • patchclass
  • s1ihome
  • s1ihome

相关链接

  • Web开发类图书

广告也精彩

反馈

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