常有人說,他們在使用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"> <!-- 作者:小林,sulins@tom.com --> <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>
|