读书人

UTf8转中文有乱码怎么解决

发布时间: 2012-08-16 12:02:16 作者: rapoo

UTf8转中文有乱码,如何解决
我用DownToStr获取一个UTF8编码的网页时返回的是乱码,再用Utf8ToUnicode转码,大部分都正确了
现在有这么一个问题,比如说 “中文1234” 这各格式的结果就是“中?234” ,也就是说中文字和后面的一个半角的数字或标点符合就会合成一个新的乱码,有什么100%无乱码的转换代码吗?


Public Function DownToStr(ByVal sUrl As String) As String
On Error GoTo ToExit '打开错误陷阱
'------------------------------------------------
Dim hOpen As Long, hFile As Long, RetLen As Long, Buffer() As Byte, szBuffer As String
hOpen = InternetOpen(vbNullString, INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 0)
hFile = InternetOpenUrl(hOpen, sUrl, vbNullString, ByVal 0&, INTERNET_FLAG_RELOAD, ByVal 0&)
If hFile <> 0 Then
Do
ReDim Buffer(OnceLen - 1)
InternetReadFile hFile, ByVal VarPtr(Buffer(0)), OnceLen, RetLen
DoEvents
If RetLen = 0 Then Exit Do
If RetLen < OnceLen Then ReDim Preserve Buffer(RetLen - 1)
szBuffer = szBuffer & CStr(Buffer)
Loop
InternetCloseHandle hFile
End If
InternetCloseHandle hOpen
DownToStr = StrConv(szBuffer, vbUnicode)
'------------------------------------------------
Exit Function
'----------------
ToExit:
DownToStr = ""
MsgBox "远程连接出错:" & Err.Number & " " & Err.Description
End Function


Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Private Const CP_UTF8 = 65001
' Utf8 to Unicode
Public Function Utf8ToUnicode(ByVal sUTF8 As String) As String

Dim lngUtf8Size As Long
Dim strBuffer As String
Dim lngBufferSize As Long
Dim lngResult As Long
Dim bytUtf8() As Byte
Dim N As Long
If LenB(sUTF8) = 0 Then Exit Function
bytUtf8 = StrConv(sUTF8, vbFromUnicode)
lngUtf8Size = UBound(bytUtf8) + 1
On Error GoTo 0
lngBufferSize = lngUtf8Size * 2
strBuffer = String$(lngBufferSize, vbNullChar)
'Translate using code page 65001(UTF-8)
lngResult = MultiByteToWideChar(CP_UTF8, 0, bytUtf8(0), lngUtf8Size, StrPtr(strBuffer), lngBufferSize)
'Trim result to actual length
If lngResult Then
Utf8ToUnicode = Left$(strBuffer, lngResult)
End If
End Function


[解决办法]

探讨
VB code
Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Lon……

[解决办法]
确定是UTF8 65001 吗?我用过一个类似函数解出来也是部分乱码.
后来经不懈努力才发现,原来那网页是936的,不是UTF8. 65001 改成936就OK了.
试试咯,解码函数网络有很多,一般都比较成熟不会出错咯~~~

读书人网 >VB

热点推荐