

VBA基础
Access如何将二进制UTF8转成字符串
2013-07-22 14:42:42
分享一个utf-8转字符串的函数。解决编码带来的错误!
调用方法:
Private Sub cmdConvert_Click()
fm20TxtText.Text = FromUtf8(FromHex(fm20TxtHex.Text))
End Sub
函数如下:
Private Declare Function CryptStringToBinary Lib "Crypt32" _
Alias "CryptStringToBinaryW" ( _
ByVal pszString As Long, _
ByVal cchString As Long, _
ByVal dwFlags As Long, _
ByVal pbBinary As Long, _
ByRef pcbBinary As Long, _
ByRef pdwSkip As Long, _
ByRef pdwFlags As Long) As Long
Private Declare Function MultiByteToWideChar Lib "kernel32" ( _
ByVal CodePage As Long, _
ByVal dwFlags As Long, _
ByVal lpMultiByteStr As Long, _
ByVal cchMultiByte As Long, _
ByVal lpWideCharStr As Long, _
ByVal cchWideChar As Long) As Long
Public Function FromHex(ByRef HexString As String) As Byte()
Const CRYPT_STRING_HEX As Long = &H4&
Dim lngOutLen As Long
Dim dwActualUsed As Long
Dim bytBinary() As Byte
If Len(HexString) < 1 Then Exit Function
'Determine output buffer length required.
If CryptStringToBinary(StrPtr(HexString), _
Len(HexString), _
CRYPT_STRING_HEX, _
0&, _
lngOutLen, _
ByVal 0&, _
dwActualUsed) = 0 Then
Err.Raise &H80044100, "FromHex", _
"CryptStringToBinary failed, error " & CStr(Err.LastDllError)
Else
'Convert to binary.
ReDim bytBinary(lngOutLen - 1)
If CryptStringToBinary(StrPtr(HexString), _
Len(HexString), _
CRYPT_STRING_HEX, _
VarPtr(bytBinary(0)), _
lngOutLen, _#p#分页标题#e#
ByVal 0&, _
dwActualUsed) = 0 Then
Err.Raise &H80044100, "FromHex", _
"CryptStringToBinary failed, error " & CStr(Err.LastDllError)
Else
FromHex = bytBinary
End If
End If
End Function
Public Function FromUtf8(ByRef Utf8() As Byte) As String
Const CP_UTF8 As Long = 65001
Dim lngBytes As Long
Dim lngResult As Long
On Error Resume Next
lngBytes = UBound(Utf8) - LBound(Utf8) + 1
If Err Then
Err.Clear
On Error GoTo 0
Err.Raise 5, "FromUtf8", "Invalid parameter: must be a dimensioned array"
End If
On Error GoTo 0
lngResult = MultiByteToWideChar(CP_UTF8, 0, VarPtr(Utf8(LBound(Utf8))), _
lngBytes, 0, 0)
FromUtf8 = String$(lngResult, 0)
MultiByteToWideChar CP_UTF8, 0, VarPtr(Utf8(LBound(Utf8))), _
lngBytes, StrPtr(FromUtf8), lngResult
End Function