远程自动抓取乱码的最佳解决方案

来源:爱站网时间:2020-09-23编辑:网友分享
在远程页面编写代码中,很多时候都能遇到自动抓取乱码的问题,使操作变得更加麻烦。今天小编为此整理了关于远程自动抓取乱码的最佳解决方案,一起看看吧!

在远程页面编写代码中,很多时候都能遇到自动抓取乱码的问题,使操作变得更加麻烦。今天小编为此整理了关于远程自动抓取乱码的最佳解决方案,一起看看吧!

由于平时使用的网页文件基本上都是gb2312编码方式,如果通过xmlhttp控件读取的话,肯定会出现乱码问题,但是要把所有文件都改成utf-8编码,操作上比较麻烦。经过反复比较,我找到了相对实用的解决方法。
  ff提供了overrideMimeType方法,可以指定返回值的编码,所以解决起来比较简单,只要把这个方法指向gb2312就可以了。对于IE,可以用vbs配合来作编码转换,用gb2utf8来转换接收到的二进制数据,其中利用到execScript方法来调用vbs的函数。

<body></body> <script> loadPage("index.htm") function loadPage(url){     var xh=window.Event?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP")     xh.open("GET",url,true)     if(window.Event)         xh.overrideMimeType("text/xml;charset=gb2312")     xh.onreadystatechange=function(){         if(xh.readyState!=4)             return         var v         v=window.Event?xh.responseText:window.gb2utf8(xh.responseBody)         alert(v)     }     window.gb2utf8=function(data){         var glbEncode=[],t,i,j,len         gb2utf8_data=data         execScript("gb2utf8_data = MidB(gb2utf8_data, 1)+' '", "vbscript")         t=escape(gb2utf8_data).replace(/%u/g,"").replace(/(.{2})(.{2})/g,"%$2%$1").replace(/%([A-Z].)%(.{2})/g,"@$1$2")         t=t.split("@")         i=0         len=t.length         while(++i<len){             j=t[i].substring(0,4)             if(!glbEncode[j]) {                 gb2utf8_char = eval("0x"+j)                 execScript("gb2utf8_char=Chr(gb2utf8_char)","vbscript")                 glbEncode[j]=escape(gb2utf8_char).substring(1,6)             }             t[i]=glbEncode[j]+t[i].substring(4)         }         gb2utf8_data=gb2utf8_char=null         return unescape(t.join("%")).slice(0,-1)     }     xh.send(null) } </script>

ie下的转码可以改进,通过正则的回调过程能提高不少效率   

this.bs2str = function(bs){  
    if(!window.jsMidB) main.vbInit("MidB", 2);  
    if(!window.jsChr) main.vbInit("Chr", 1);  
    if(!bs2str.ss) bs2str.ss = [];  
    return unescape(escape(jsMidB(bs,1)).replace(/(.{2})(.{2})(.{2})/g, "%$3%$2").replace(/%([^0-7].)(.)(.{2})/g, function(a,a1,a2,a3){var s=a1+a3;if(!bs2str.ss[s]) bs2str.ss[s]=jsChr(eval("0x"+s));return bs2str.ss[s];}));  
    } 

 不过我还是认为载入数据用xmldom要好一些 
replace(/(.{2})(.{2})(.{2})/g, "%$3%$2") 改成 replace(/.{2}(.{2})(.{2})/g, "%$2%$1") 少一个存储.比原来的快3倍以上. 
把eval去掉,效率还能提高一些 

 

 // byte() encoding 
    this.bs2str = function(bs){ 
        if(!window.jsMidB) main.vbInit("MidB", 2); 
        if(!window.jsChr) main.vbInit("Chr", 1); 
        if(!this.bs2str.ss) this.bs2str.ss = []; 
        return unescape(escape(jsMidB(bs,1)).replace(/.{2}(.{2})(.{2})/g, "%$2%$1").replace(/%([^0-7].)(.)(.{2})/g, function(a,a1,a2,a3){var s=a1+a3;if(!This.bs2str.ss[s]) This.bs2str.ss[s]=jsChr("&H"+s);return This.bs2str.ss[s];})); 
    }  

通过以上小编的分享后,大家伙对此是不是有了比较深刻的了解,以后遇到这种问题,就可以用这种方法解决啦!

上一篇:网页广告弹出问题用ajax即可

下一篇:关于AJAX常用函数有哪些

您可能感兴趣的文章

相关阅读

热门软件源码

最新软件源码下载