用Inel元件下載 正確網頁內碼 for VB
VB.Net 個人不知 (理論上也適用)
以下適用 VB 6.x以下
如果要用 Inel元件下載網頁 (好處是 可作分析用、下載快,因為不會多下載 圖片、影音 等資料)
如網頁文字編碼非本地編碼的話 (比如你是用繁體Windows BIG5語系,而網頁是 GB、JIS、UTF-8...等字集)
這樣的話
下載回來的內容會有很多 ?號
(因為 VB APP 是一個預設運作在 ANSI的軟體,就算FROM 2.0元件也無解)
所以這裡使用 MultiByteToWideChar API函式來解決
此函式是根據 使用者要求的格式旗標 將 字串 轉成 其他內碼 的 雙位元組字串格式
另外還有一個重點
在VB裡編譯器會自動做 Byte String(一種Byte陣列變數)與 String的轉換
VB 的 String是一種可變長度的字串格式,內部是由 [字串資訊]+[Byte Array] 組成,
所以6.0編譯器體貼使用者 兩者可直接用 =號 做轉換
PHP 語法:
Public Function myMultiByteToWideChar(ByVal lpString As String, Optional ByVal CodePageFlags As enuCodePage = CP_UTF8) As String Dim cbWChar As Long Dim strBytes() As Byte '宣告一個 vbNullChar ReDim tBytes(0) As Byte '為了使用API 字串格式需以 vbNullChar結尾,也可以填 Chr(0) strBytes = lpString & vbNullChar '傳回 轉換成 內碼為CodePageFlags的字串 需多少長度(cbWChar)的字串,注意最後一個參數需為 0 才能這麼用 cbWChar = MultiByteToWideChar(CodePageFlags, 0, strBytes(0), -1, tBytes(0), 0) '利用上面得知的所需長度 重新宣告一固定長度的 字串(strBytes), 減1是因為 陣列是重 0開始,會多一個 ReDim tBytes((cbWChar - 1) * 2 - 1) As Byte '正式將 strBytes字串轉成 內碼為CodePageFlags格式的字串,存放到 tBytes裡 Call MultiByteToWideChar(CodePageFlags, 0, strBytes(0), -1, tBytes(0), cbWChar - 1) '將Byte格式的字串轉成String格式的字串 myMultiByteToWideChar = tBytes End Function
那如何使用
Dim sURL As String
Dim sURLText As String
sURL = "http://A.B.C.D/my.html"
sURLText = Inet1.OpenURL(Trim(sURL), icByteArray) '讀入原始檔
sURLText = myMultiByteToWideChar(sURLText, enuCodePage.CP_UTF8)
至於為何是 enuCodePage.CP_UTF8
當然要事先判斷
因為不是重點,想完成完整的功能就交給網友們自己發揮了
以下是會用到的宣告
PHP 語法:
Public Declare Function WideCharToMultiByte Lib "kernel32" ( _ ByVal CodePage As Long, _ ByVal dwFlags As Long, _ lpWideCharStr As Any, _ ByVal cchWideChar As Long, _ lpMultiByteStr As Any, _ ByVal cchMultiByte As Long, _ ByVal lpDefaultChar As Long, _ ByVal lpUsedDefaultChar As Long) As Long Public Declare Function MultiByteToWideChar Lib "kernel32" ( _ ByVal CodePage As Long, _ ByVal dwFlags As Long, _ lpMultiByteStr As Any, _ ByVal cchMultiByte As Long, _ lpWideCharStr As Any, _ ByVal cchWideChar As Long) As Long ' 字元碼 Public Enum enuCodePage CP_UNKNOWN = -1 CP_ACP = 0 CP_OEMCP = 1 CP_MACCP = 2 CP_THREAD_ACP = 3 CP_SYMBOL = 42 CP_JAPAN = 932 CP_CHINA = 936 CP_KOREA = 949 CP_TAIWAN = 950 CP_GB2312 = 936 CP_Big5 = 950 CP_Unicode = 1200 CP_ANSI = 1252 CP_UTF7 = 65000 CP_UTF8 = 65001 ' Flags MB_PRECOMPOSED = &H1 MB_COMPOSITE = &H2 MB_USEGLYPHCHARS = &H4 MB_ERR_INVALID_CHARS = &H8 WC_DEFAULTCHECK = &H100 ' check for default char WC_COMPOSITECHECK = &H200 ' convert composite to precomposed WC_DISCARDNS = &H10 ' discard non-spacing chars WC_SEPCHARS = &H20 ' generate separate chars WC_DEFAULTCHAR = &H40 ' replace with default char End Enum
|