史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 程式語言討論區
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2007-03-10, 08:49 PM   #1
mini
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時
註冊日期: 2002-12-07
文章: 13249
精華: 0
現金: 26241 金幣
資產: 3024051 金幣
預設 教學 - 用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 StringOptional 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) * 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 
mini 目前離線  
送花文章: 1999, 收花文章: 7957 篇, 收花: 26749 次
回覆時引用此帖
發文 回覆



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 04:10 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1