欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

如何解决远程页面抓取中的乱码问题

程序员文章站 2022-03-14 10:37:49
由于平时使用的网页文件基本上都是gb2312编码方式,如果通过xmlhttp控件读取的话,肯定会出现乱码问题,但是要把所有文件都改成utf-8编码,操作上比较麻烦。经过反复...

由于平时使用的网页文件基本上都是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>