Lly's Blog

 解决Inet控件下载utf-8网页乱码的问题

本站整理, 发表于:2015-05-29 22:22:24, 分类:资源共享 浏览( ) 评论( )  收藏这篇日志

Inet控件(Internet Transfer Control控件)下载网页的HTML代码是很方便,不过有个问题,在读取的是utf-8编码的网页时会出现乱码。这也难怪VB默认支持的是UNICODE编码,在读取utf-8的数据时自然不知所措了。

(注:如果你还不知道上面所说的各种字符编码方式的意义的话,那您还是先阅读一下这篇文章:各种字符编码方式详解(ANSI,UNICODE,UTF-8,GB2312,GBK),如果您已经知道请继续)

那怎么才能将utf-8的网页数据转换成UNICODE呢?
首先Inet取得数据的时候必须用二进制的形式取得,比如:
异步调用:
 

vb 代码
 
  1. Private Sub Command1_Click()
  2.     Dim StrUrl As String
  3.     
  4.     StrUrl = Text1.Text
  5.     Inet1.Execute StrUrl, "GET"
  6. End Sub
  7.  
  8. Private Sub Inet1_StateChanged(ByVal State As Integer)
  9.     If State = icResponseCompleted Then
  10.         Dim BinBuff() As Byte
  11.         
  12.         BinBuff = Inet1.GetChunk(0, icByteArray)
  13.     End If
  14. End Sub
  15.  

同步调用:
 

vb 代码
 
  1. Private Sub Command2_Click()
  2.     Dim BinBuff() As Byte
  3.     Dim StrUrl As String
  4.     
  5.     StrUrl = Text1.Text
  6.     BinBuff = Inet1.OpenURL(Text1.Text, icByteArray)
  7.     RichTextBox1.Text = Utf8ToUnicode(BinBuff)
  8. End Sub

上面是取得inet取得二进制数据的代码

添加模块
 

vb 代码
 
  1. 'utf-8转换UNICODE代码
  2. Option Explicit
  3.  
  4. Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As LongByVal dwFlags As LongByVal lpMultiByteStr As LongByVal cchMultiByte As LongByVal lpWideCharStr As LongByVal cchWideChar As LongAs Long
  5. Private Const CP_UTF8 = 65001
  6.  
  7. Function Utf8ToUnicode(ByRef Utf() As ByteAs String
  8.     Dim lRet As Long
  9.     Dim lLength As Long
  10.     Dim lBufferSize As Long
  11.     lLength = UBound(Utf) - LBound(Utf) + 1
  12.     If lLength <= 0 Then Exit Function
  13.     lBufferSize = lLength * 2
  14.     Utf8ToUnicode = String$(lBufferSize, Chr(0))
  15.     lRet = MultiByteToWideChar(CP_UTF8, 0, VarPtr(Utf(0)), lLength, StrPtr(Utf8ToUnicode), lBufferSize)
  16.     If lRet <> 0 Then
  17.         Utf8ToUnicode = Left(Utf8ToUnicode, lRet)
  18.     Else
  19.         Utf8ToUnicode = ""
  20.     End If
  21. End Function
  22.  

Utf8ToUnicode函数即可将Inet收到的二进制数组转换成UNICODE字符串。传入参数为二进制数组返回转换后的字符串。
上面的代码可为:
 

vb 代码
 
  1. Private Sub Inet1_StateChanged(ByVal State As Integer)
  2.     If State = icResponseCompleted Then
  3.         Dim BinBuff() As Byte
  4.         
  5.         BinBuff = Inet1.GetChunk(0, icByteArray)
  6.         RichTextBox1.Text = Utf8ToUnicode(BinBuff)
  7.     End If
  8. End Sub

返回之后在RichTextBox1中显示,发现本来乱码的中文现在已经能正常显示了。

 

正在读取日志的评论数据,请稍后……
正在加载日志评论签写框,请稍后……
 成员登录通道
正在载入成员登录通道...
 BLOG 日历助手
正在载入日历助手...
 BLOG 统计信息
正在载入统计信息...
 BLOG 日志归档
 BLOG 推荐日志
  • 暂时没有推荐日志
 BLOG 最新评论
{$SideComment}
 BLOG 最新留言
{$SideGB}
 BLOG 站内搜索

Tags Cloud: