明志唯新

支持百度的搜索引擎来源的关键字加亮

发表于

我们在上网使用搜索引擎的时候,经常会遇到类似这样的一个问题:从 Google 上搜索到了一个包含了“税收”的文章,但是打开对应的网站页面时发现这篇文章很长,很难确定税务在文章中的位置,即使使用浏览器的查找功能,也并不爽。那么如何改进信息类网站在此需求上的用户体验呢?一个国外的朋友做了件好事情:http://www.kryogenix.org/code/browser/searchhi/,他在这个页面上提供了一个 js,可以很方便的实现我们的需求。但是这个脚本对 baidu 没有什么效果为什么呢?首先我们看看他的部分代码:

if (qsip[0] == 'q' || qsip[0] == 'p') { // q= for Google, p= for Yahoo
    words = unescape(qsip[1].replace(/\+/g,' ')).split(/\s+/);
    for (w=0;whighlightWord(document.getElementsByTagName("body")[0],words[w]);
    }
}

上述代码获取来源地址中 q 或 p 的值,q 对应的是 google 的搜索关键字,p 是 Yahoo 的搜索关键字,而且这两个关键字是 utf-8 编码的,使用 js 自然可以很方便的处理,但是百度搜索的则有较大不同:搜索关键字的对应的地址参数是 wd,且编码为 GB2312。如何解决这个问题呢?我这里使用了 js 结合 vbs 的办法来解决该问题。

首先我们使用 vbs 写一个函数解决编码问题:

Function DeCodeAnsi(s)
	Dim i, sTmp, sResult, sTmp1
	sResult = ""
	For i=1 To Len(s)
		If Mid(s,i,1)="%" Then
			sTmp = "&H" & Mid(s,i+1,2)
			If isNumeric(sTmp) Then
				If CInt(sTmp)=0 Then
					i = i + 2
				ElseIf CInt(sTmp)>0 And CInt(sTmp)<128 Then
					sResult = sResult & Chr(sTmp)
					i = i + 2
				Else
					If Mid(s,i+3,1)="%" Then
						sTmp1 = "&H" & Mid(s,i+4,2)
						If isNumeric(sTmp1) Then
							sResult = sResult & Chr(CInt(sTmp)*16*16 + CInt(sTmp1))
							i = i + 5
						End If
					Else
						sResult = sResult & Chr(sTmp)
						i = i + 2
					End If
				End If
			Else
				sResult = sResult & Mid(s,i,1)
			End If
		Else
			sResult = sResult & Mid(s,i,1)
		End If
	Next
	DeCodeAnsi = sResult
End Function

然后在 js 中调用这个 vbs 的函数:

if (qsip[0] == 'wd') { // wd= for baidu
    if(qsip[1]=='') continue;
    execScript('wd = DeCodeAnsi("'+qsip[1]+'")','vbscript');
    words = decodeURI(wd.replace(/\+/g,' ')).split(/\s+/);
    for (w=0;whighlightWord(document.getElementsByTagName("body")[0],words[w]);
    }
}

ok 问题解决了。

使用的时候在网页中加上以下两行就好了:
searchhi.js (2.23 KB)
searchhi.vbs(.93 KB)