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

vbs或asp采集文章时网页编码问题

程序员文章站 2022-06-21 22:49:17
'/*========================================================================= &nbs...
'/*=========================================================================   
' * intro       研究网页编码很长时间了,因为最近要设计一个友情链接检测的vbs脚本,而与你链接的人的页面很可能是各种编码,以前采取的方法是:如果用gb2312查不到再用utf-8查,再找不到证明对方没有给你做链接虽然不是100%正确,但也差不多了,这两种编码用的人比较多,偶然间在收藏夹里的一个地址看到的一个思路,终于可以在采集文章时自动判断网页的编码了。因为研究过程中这个问题困扰很久,虽然现在觉得简单了,想必很多人还在找,所以把这三个函数贴出来。   
' * filename    getwebcodepage.vbs   
' * author      yongfa365   
' * version     v2.0   
' * web         http://www.yongfa365.com   
' * email       yongfa365[at]qq.com   
' * firstwrite  http://www.yongfa365.com/item/getwebcodepage.vbs.html   
' * madetime    2008-01-29 20:55:46   
' * lastmodify  2008-01-30 20:55:46   
' *==========================================================================*/   

  
call gethttppage("http://www.baidu.com/")   
call gethttppage("http://www.google.com/")   
call gethttppage("http://www.yongfa365.com/")   
call gethttppage("http://www.cbdcn.com/")   
call gethttppage("http://www.csdn.net/")   

  
'得到匹配的内容,返回数组   
'getcontents(表达式,字符串,是否返回引用值)   
'msgbox getcontents("a(.+?)b", "a23234b ab a67896896b sadfasdfb" ,true)(0)   

function getcontents(patrn, strng , yinyong)   
'by www.yongfa365.com 转载请保留链接,以便最终用户及时得到最新更新信息   
    on error resume next  
    set re = new regexp  
    re.pattern = patrn   
    re.ignorecase = true  
    re.global = true  
    set matches = re.execute(strng)   
    if yinyong then  
        for i = 0 to matches.count -1   
            if matches(i).value<>"" then retstr = retstr & matches(i).submatches(0) & "柳永法"  
        next  
    else  
        for each omatch in matches   
            if omatch.value<>"" then retstr = retstr & omatch.value & "柳永法"  
        next  
    end if  
    getcontents = split(retstr, "柳永法")   
end function  

function gethttppage(url)   
    on error resume next  
    set xmlhttp = createobject("msxml2.xmlhttp")   
    xmlhttp.open "get", url, false  
    xmlhttp.send   
    if xmlhttp.status<>200 then exit function  
    getbody = xmlhttp.responsebody   
    '柳永法(www.yongfa365.com)在此的思路是,先根据返回的字符串找,找文件头,如果还没有的话就用gb2312,一般都能直接匹配出编码。   
    '在返回的字符串里看,虽然中文是乱码,但不影响我们取其编码,   
    getcodepage = getcontents("charset=[""']*([^"",']+)", xmlhttp.responsetext , true)(0)   
    '在头文件里看编码   
     if len(getcodepage)<3 then getcodepage = getcontents("charset=[""']*([^"",']+)", xmlhttp.getresponseheader("content-type") , true)(0)   
    if len(getcodepage)<3 then getcodepage = "gb2312"  
    set xmlhttp = nothing  
    '下边这句在正式使用时要屏蔽掉   
    wscript.echo url & "-->" & getcodepage   
    gethttppage = bytestobstr(getbody, getcodepage)   
end function  

  
function bytestobstr(body, cset)   
    on error resume next  
    dim objstream   
    set objstream = createobject("adodb.stream")   
    objstream.type = 1   
    objstream.mode = 3   
    objstream.open  
    objstream.write body   
    objstream.position = 0   
    objstream.type = 2   
    objstream.charset = cset   
    bytestobstr = objstream.readtext   
    objstream.close  
    set objstream = nothing  
end function