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