常有人說,他們在使用XMLHTTP過程中,總是為中文亂碼的問題煩惱。本人查閱了一些資料,結果令我失望,大家都是用ASP伺服器端技術解決這個問題。
先分析一下為何會出現中文亂碼的問題。原因很簡單:XMLHTTP得到Response時假定Response是UTF8編碼的,它把含GB2312編碼的HTML當成UTF8格式,因此,出現了中文亂碼。
那麼,除了使用ASP伺服器端腳本技術外,就沒有客戶端的解決方法嗎?答案是:有!
本人使用VBScript客戶端腳本,成功實現了不使用ASP,解決了XMLHTTP 抓取HTML頁面時出現中文亂碼的問題。
為何使用VBScript,而不是大家常用的JScript? XMLHTTP的responseBody回傳的是一個unsigned bytes陣列。 VBScript提供了許多用於操作字串和格式化資料的函數,以及存取安全數組的方法。這些函數或方法在JScript中並不存在。這裡我們需要使用VBScript的內建函數:MidB、AscB、LenB等,來存取responseBody。
說句題外話,我不是強調VBScript比JScript好,而是二者都有自己的特色。第一次在CSDN上寫文章,謝謝大家支持。寫這邊文章有兩個目的:一、鍛鍊自己;二、希望大家遇到問題時,要學會分析問題,做到有的放矢,知其然也知其所以然。
我給出程式碼Test.htm,它包括了取得自身程式碼和取得其他網頁程式碼兩種應用,具體腳本如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- 作者:小林, [email protected] -->
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=gb2312">
</HEAD>
<script language=VBScript>
Function bytes2BSTR(vIn)
strReturn = ""
For i = 1 To LenB(vIn)
ThisCharCode = AscB(MidB(vIn,i,1))
If ThisCharCode < &H80 Then
strReturn = strReturn & Chr(ThisCharCode)
Else
NextCharCode = AscB(MidB(vIn,i+1,1))
strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))
i = i + 1
End If
Next
bytes2BSTR = strReturn
End Function
Function viewSource1()
dim XmlHttp
set XmlHttp = CreateObject("Microsoft.XMLHTTP")
XmlHttp.Open "GET", document.location.href, false
XmlHttp.setRequestHeader "Content-Type","text/XML"
XmlHttp.Send
dim html
html = bytes2BSTR(XmlHttp.responseBody)
msgbox html
End Function
Function viewSource2()
dim XmlHttp
set XmlHttp = CreateObject("Microsoft.XMLHTTP")
XmlHttp.Open "GET", " http://www.google.com ", false
XmlHttp.setRequestHeader "Content-Type","text/XML"
XmlHttp.Send
dim html
html = bytes2BSTR(XmlHttp.responseBody)
msgbox html
End Function
</script>
<BODY bgcolor=gainsboro style='border:1pt solid white'>
<TABLE class=text>
<tr>
<td class=text>XMLHTTP Get HTML頁面時的中文亂碼之完全客戶端Script解決方案</td>
</tr>
<tr>
<td class=button><button onclick=viewSource1()>查看自身的網頁程式碼</button></td>
</tr>
<tr>
<td class=button><button onclick=viewSource2()>查看google首頁程式碼</button></td>
</tr>
</TABLE>
</BODY>
</HTML>