手机
当前位置:查字典教程网 >编程开发 >ASP教程 >[转]ASP实现关键词获取(各搜索引擎,GB2312及UTF-8)
[转]ASP实现关键词获取(各搜索引擎,GB2312及UTF-8)
摘要:不知道为什么现在各大搜索引擎编码居然不一样.当然不是GB2312就是UTF-8了.编码问题是比较头疼的问题...头疼的不要命...我们获得关...

不知道为什么现在各大搜索引擎编码居然不一样.当然不是GB2312就是UTF-8了.编码问题是比较头疼的问题...头疼的不要命...

我们获得关键词,一般是通过来访页面的url进行分析的.比如

http://www.google.com/search?hl=zh-CN&q=%E5%AD%A4%E7%8B%AC&lr=

各位肯定知道这个是通过urlencode编码的.

我们得到其中的信息,需要进行2步.第一步是进行urldecode,在我们普通参数活得的时候,这个是由ASP自己来进行的,但是现在我们不得不进行手工解码.

网上函数很多,但都是针对于GB2312页面解GB2312.UTF-8的.对于这个,我们可以很轻松的先进行解码,然后根据搜索引擎判断它的编码,如果是UTF-8就再转换为GB2312.

但是由于我的网站是UTF-8页面的.而UTF-8页面我找到的只有解UTF-8字符的urldecode编码的.在这里停顿了很久,最后我只能用最糟糕的方法,把拆分出来的关键词用xmlhttp提交到一个GB2312的ASP页面,然后活得乱码(GB2312)后再进行GB2312toUTF-8的转换.

下面主要实现代码.

PublicFunctionGetSearchKeyword(RefererUrl)’搜索关键词

ifRefererUrl=""orlen(RefererUrl)<1thenexitfunction

onerrorresumenext

Dimre

Setre=NewRegExp

re.IgnoreCase=True

re.Global=True

Dima,b,j

’模糊查找关键词,此方法速度较快,范围也较大

re.Pattern="(word=([^&]*)|q=([^&]*)|p=([^&]*)|query=([^&]*)|name=([^&]*)|_searchkey=([^&]*)|baidu.*?w=([^&]*))"

Seta=re.Execute(RefererUrl)

Ifa.Count>0then

Setb=a(a.Count-1).SubMatches

Forj=1tob.Count

IfLen(b(j))>0then

ifinstr(1,RefererUrl,"google",1)then

GetSearchKeyword=Trim(U8Decode(b(j)))

elseifinstr(1,refererurl,"yahoo",1)then

GetSearchKeyword=Trim(U8Decode(b(j)))

elseifinstr(1,refererurl,"yisou",1)then

GetSearchKeyword=Trim(getkey(b(j)))

elseifinstr(1,refererurl,"3721",1)then

GetSearchKeyword=Trim(getkey(b(j)))

else

GetSearchKeyword=Trim(getkey(b(j)))

endif

ExitFunction

endif

Next

EndIf

iferrthen

err.clear

GetSearchKeyword=RefererUrl

else

GetSearchKeyword=""

endif

EndFunction

FunctionURLEncoding(vstrIn)

dimstrReturn,i,thischr

strReturn=""

Fori=1ToLen(vstrIn)

ThisChr=Mid(vStrIn,i,1)

IfAbs(Asc(ThisChr))<&HFFThen

strReturn=strReturn&ThisChr

Else

innerCode=Asc(ThisChr)

IfinnerCode<0Then

innerCode=innerCode+&H10000

EndIf

Hight8=(innerCodeAnd&HFF00)&HFF

Low8=innerCodeAnd&HFF

strReturn=strReturn&"%"&Hex(Hight8)&"%"&Hex(Low8)

EndIf

Next

URLEncoding=strReturn

EndFunction

functiongetkey(key)

dimoreq

setoreq=CreateObject("MSXML2.XMLHTTP")

oReq.open"POST","http://"&WebUrl&"/system/ShowGB2312XML.asp?a="&key,false

oReq.send

getkey=UTF2GB(oReq.responseText)

endfunction

functionchinese2unicode(Str)

dimi

dimStr_one

dimStr_unicode

fori=1tolen(Str)

Str_one=Mid(Str,i,1)

Str_unicode=Str_unicode&chr(38)

Str_unicode=Str_unicode&chr(35)

Str_unicode=Str_unicode&chr(120)

Str_unicode=Str_unicode&Hex(ascw(Str_one))

Str_unicode=Str_unicode&chr(59)

next

Response.WriteStr_unicode

endfunction

functionUTF2GB(UTFStr)

Dimdig,GBSTR

forDig=1tolen(UTFStr)

ifmid(UTFStr,Dig,1)="%"then

iflen(UTFStr)>=Dig+8then

GBStr=GBStr&ConvChinese(mid(UTFStr,Dig,9))

Dig=Dig+8

else

GBStr=GBStr&mid(UTFStr,Dig,1)

endif

else

GBStr=GBStr&mid(UTFStr,Dig,1)

endif

next

UTF2GB=GBStr

endfunction

functionConvChinese(x)

dima,i,j,DigS,Unicode

A=split(mid(x,2),"%")

i=0

j=0

fori=0toubound(A)

A(i)=c16to2(A(i))

next

fori=0toubound(A)-1

DigS=instr(A(i),"0")

Unicode=""

forj=1toDigS-1

ifj=1then

A(i)=right(A(i),len(A(i))-DigS)

Unicode=Unicode&A(i)

else

i=i+1

A(i)=right(A(i),len(A(i))-2)

Unicode=Unicode&A(i)

endif

next

iflen(c2to16(Unicode))=4then

ConvChinese=ConvChinese&chrw(int("&H"&c2to16(Unicode)))

else

ConvChinese=ConvChinese&chr(int("&H"&c2to16(Unicode)))

endif

next

endfunction

functionU8Decode(enStr)

’输入一堆有%分隔的字符串,先分成数组,根据utf8规则来判断补齐规则

’输入:关E585B3键E994AE字E5AD97

’输出:关B9D8键BCFC字D7D6

dimc,i,i2,v,deStr,WeiS

fori=1tolen(enStr)

c=Mid(enStr,i,1)

ifc="%"then

v=c16to2(Mid(enStr,i+1,2))

’判断第一次出现0的位置,

’可能是1(单字节),3(3-1字节),4,5,6,7不可能是2和大于7

’理论上到7,实际不会超过3。

WeiS=instr(v,"0")

v=right(v,len(v)-WeiS)’第一个去掉最左边的WeiS个

i=i+3

fori2=2toWeiS-1

c=c16to2(Mid(enStr,i+1,2))

c=right(c,len(c)-2)’其余去掉最左边的两个

v=v&c

i=i+3

next

iflen(c2to16(v))=4then

deStr=deStr&chrw(c2to10(v))

else

deStr=deStr&chr(c2to10(v))

endif

i=i-1

else

ifc="+"then

deStr=deStr&""

else

deStr=deStr&c

endif

endif

next

U8Decode=deStr

endfunction

functionc16to2(x)

’这个函数是用来转换16进制到2进制的,可以是任何长度的,一般转换UTF-8的时候是两个长度,比如A9

’比如:输入“C2”,转化成“11000010”,其中1100是"c"是10进制的12(1100),那么2(10)不足4位要补齐成(0010)。

dimtempstr

dimi:i=0’临时的指针

fori=1tolen(trim(x))

tempstr=c10to2(cint(int("&h"&mid(x,i,1))))

dowhilelen(tempstr)<4

tempstr="0"&tempstr’如果不足4位那么补齐4位数

loop

c16to2=c16to2&tempstr

next

endfunction

functionc2to16(x)

’2进制到16进制的转换,每4个0或1转换成一个16进制字母,输入长度当然不可能不是4的倍数了

dimi:i=1’临时的指针

fori=1tolen(x)step4

c2to16=c2to16&hex(c2to10(mid(x,i,4)))

next

endfunction

functionc2to10(x)

’单纯的2进制到10进制的转换,不考虑转16进制所需要的4位前零补齐。

’因为这个函数很有用!以后也会用到,做过通讯和硬件的人应该知道。

’这里用字符串代表二进制

c2to10=0

ifx="0"thenexitfunction’如果是0的话直接得0就完事

dimi:i=0’临时的指针

fori=0tolen(x)-1’否则利用8421码计算,这个从我最开始学计算机的时候就会,好怀念当初教我们的谢道建老先生啊!

ifmid(x,len(x)-i,1)="1"thenc2to10=c2to10+2^(i)

next

endfunction

functionc10to2(x)

’10进制到2进制的转换

dimsign,result

result=""

’符号

sign=sgn(x)

x=abs(x)

ifx=0then

c10to2=0

exitfunction

endif

dountilx="0"

result=result&(xmod2)

x=x2

loop

result=strReverse(result)

ifsign=-1then

c10to2="-"&result

else

c10to2=result

endif

endfunction

functionURLDecode(enStr)

dimdeStr,strSpecial

dimc,i,v

deStr=""

strSpecial="!""#$%&’()*+,/:;<=>?@[]^`{|}~%"

fori=1tolen(enStr)

c=Mid(enStr,i,1)

ifc="%"then

v=eval("&h"+Mid(enStr,i+1,2))

ifinStr(strSpecial,chr(v))>0then

deStr=deStr&chr(v)

i=i+2

else

v=eval("&h"+Mid(enStr,i+1,2)+Mid(enStr,i+4,2))

deStr=deStr&chr(v)

i=i+5

endif

else

ifc="+"then

deStr=deStr&""

else

deStr=deStr&c

endif

endif

next

URLDecode=deStr

endfunction

许多代码都是网上的.找不到作者.

PS:现在暑假就要接受,由于家庭原因我不想留在我的城市.中考到达本地重点.不想说城市名字.否则会招来熟人.只要不在山东的学校算是重点的能不能联系下.

QQ:32113739

对程序有极大兴趣,但信息奥赛只活得一等的X名.因为我认为技术不应该在所谓竞赛中体现,就如才能不应该在那些无意义的考试中体现一样.电子作品也弄了各省一等..不过也一般学习一般...所以只要是一般重点就好了..只是不想在离家太近的地方.

现在ASP十分熟练,虽然有些知识缺陷,比如编码问题(汗...),但是网络如此大,我想我不是只有在课本中才能得到所谓的知识.而且现在正在啃ASP.net的书,如果贵校做网站完全可以帮忙.

对新技术十分狂热,虽然被他们称为审美有障碍的人.但我想看到结构偶的程序还不至于吐血.

算了..再贴点.

偶开发DDatabase+ASP->xml+xslt->xhtml+css的算是叫CMS的东西

http://www.joysou.com

也用了CSDN用的FCK编辑器,今天上来才发现换了.不过那个FCK的FIle系统让偶统统改掉.

这个系统在暑假结束前一定会发布.不过很多朋友说易用性有问题...很多人不会xslt.汗...

唉...如果找不到学校.我也许会漂泊,也许会消失吧.当然这不是威胁..只是恨我的城市,恨那里看到的,干过的一切.

【[转]ASP实现关键词获取(各搜索引擎,GB2312及UTF-8)】相关文章:

asp的一个日期格式化函数

xmlhttp的open方法使用详解

ASP实现头像图像随机变换

ASP实现网址的桌面快捷方式下载

ASP中数据库调用中常见错误的现象和解决

利用ASP实现事务处理的方法

自己做采集程序

FSO 读出TXT文件

ASP语法注释

ASP应用之模板采用

精品推荐
分类导航