内容显示页
 
类别:ASP+VBS | 浏览(1269) | 2008-1-29 21:15:25

'/*=========================================================================
' * 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

 


引用本页地址:http://www.yongfa365.com/item/GetWebCodePage.vbs.html
 
 
相关链接
 
网友评论:
1 荆棘鸟 - 2008-2-6 21:25:42
有一个http头,也可以参考一下,不过这个可能不准确Content-Type
如果里面有 charset=UTF-8 那就是utf-8了,否则就是gb2312
 
2 yongfa365 - 2008-2-15 21:43:54

事实上并不是这么简单,IE编码辨别好像根据很多条件判断的,包括取特征文字,我做了一个友情链接检测的VBS,取xmlhttp.getResponseHeader("Content-Type")或xmlhttp.ResponseText ,以哪个为准都不一定,有些人设计的网站编码很乱的.

 
3 zhouweizhu - 2008-10-5 10:24:31
我查了下网上xmlhttp的资料如下
============================================
responseBody 将回应信息正文以unsigned byte数组形式返回.只读

变量,此属性只读,以unsigned array格式表示直接从服务器返回的未经解码的二进制数据。
============================================
responseText 将响应信息作为字符串返回.只读

XMLHTTP尝试将响应信息解码为Unicode字符串,XMLHTTP默认将响应数据的编码定为UTF-8,如果服务器返回的数据带BOM(byte-order mark),XMLHTTP可以解码任何UCS-2 (big or little endian)或者UCS-4 数据。注意,如果服务器返回的是xml文档,此属性并不处理xml文档中的编码声明。你需要使用responseXML来处理。
============================================

xmlhttp.ResponseText返回的不就是自动解码后的网页源码吗?
为何还要用xmlhttp.ResponseBody 然后再自己解码呢?难道有特殊情况下不准确?
 
4 yongfa365 - 2008-10-5 13:05:51
@zhouweizhu
xmlhttp.ResponseText是以utf-8编码反回数据的,如果你要获取的页面是非utf-8编码会显示乱码,如果要获取的网页本身就是utf-8编码用xmlhttp.ResponseText没有任何问题。
 
5 匿名网友 - 2008-10-5 14:54:34
汗一个,测试了下百度,还真是乱码
 
6 supra shoes - 2010-12-27 16:15:22
谢谢楼主分享!
 
姓名: 记住我
网址:
邮箱:
内容:
验证码:  验证码图片 看不清? 换张图试试
 
     
 
 
文章分类
 
 
.Net + C#(73)
 
 
ASP+VBS(161)
 
 
 
Linux(10)
 
 
 
web 2.0(26)
 
 
 
 
 
心程(68)
 
生活(97)
 
 
     

Power by :柳永法(yongfa365)'Blog  | 京ICP备07011491号  QQ:64049027  E-mail:64049027@qq.com yongfa365'CodePlex yongfa365'CodeGoogle

申请友情链接 要求:跟本站主题相类似正规网站,双方交换为首页位置

转载请注明来源,以便后人及时得到最新、修正、加强版!!!