关于Adodb.Stream从UTF-8转到GB2312过程中会多出文字的有关问题
求助关于Adodb.Stream从UTF-8转到GB2312过程中会多出文字的问题?
问题就是一个UTF-8的文件,转成GB2312的文件,文件内容都可以正常转换,但会在文件尾部多出一些乱码的多余内容?
我查看了一下,10个字节的GB2312文件转成UTF-8文件是18个字节,但18个字节的UTF-8文件不会转成10个字节的GB2312文件,转出来的还是18个字节,其中多出来的8个字节就是多余的杂乱内容,这个问题该怎么解决?
------解决方案--------------------
问题就是一个UTF-8的文件,转成GB2312的文件,文件内容都可以正常转换,但会在文件尾部多出一些乱码的多余内容?
我查看了一下,10个字节的GB2312文件转成UTF-8文件是18个字节,但18个字节的UTF-8文件不会转成10个字节的GB2312文件,转出来的还是18个字节,其中多出来的8个字节就是多余的杂乱内容,这个问题该怎么解决?
- VB code
Sub FileZM(sFile As String, sCode As String, dFile As String, dCode As String) Dim ObjStream As Object Set ObjStream = CreateObject("Adodb.Stream") With ObjStream .Mode = 3 .Type = 1 .Open .LoadFromFile sFile .Position = 0 .Type = 2 .Charset = sCode sCode = .ReadText .Position = 0 .Type = 2 .Charset = dCode .WriteText sCode .SaveToFile dFile, 2 .Close End With Set ObjStream = Nothing
------解决方案--------------------
- VB code
Option Explicit Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long) '如果可选的sytle参数为"hex", 输出utf8的hex字符串(用于调试和专门目的),否则默认输出的是utf的字符串 Public Function Str_UTF_8(ByVal Str_GB As String, Optional ByVal Sytle As String = "string") As String Dim Source() As Byte Dim UTF_16 As Long Dim Str_Bin As String Dim My_utf_Bin As String Dim Str_chr As String Dim UTF_VAL As Long Dim Str_hex As String Dim Str_utf_hex As String Dim i As Integer Dim j As Integer Dim nLength As Long For j = 1 To Len(Str_GB) CopyMemory UTF_VAL, ByVal StrPtr(Mid(Str_GB, j, 1)), 2 '得到unicode码 Str_hex = Hex(UTF_VAL) '转为16进制字符串 Str_Bin = H_To_B(Str_hex, 16) '转为2进制字符串 If UTF_VAL < &H80 Then ' 1 UTF-8 byte 英文字符 My_utf_Bin = Mid(Str_Bin, 9, 8) ElseIf UTF_VAL < &H800 Then ' 2 UTF-8 bytes 非英文字符 My_utf_Bin = "110" + Mid(Str_Bin, 5, 5) + "10" + Mid(Str_Bin, 11, 6) Else ' 3 UTF-8 bytes My_utf_Bin = "1110" + Mid(Str_Bin, 1, 4) + "10" + Mid(Str_Bin, 5, 6) + "10" + Mid(Str_Bin, 11, 6) End If Str_utf_hex = Str_utf_hex + B_To_H(My_utf_Bin) '转为utf8的16进制字符串 Next j nLength = Len(Str_utf_hex) / 2 ReDim Source(Len(Str_utf_hex) / 2) For i = 1 To Len(Str_utf_hex) Step 2 CopyMemory Source((i + 1) / 2), ByVal StrPtr(ChrB("&h" + Mid(Str_utf_hex, i, 2))), 1 Str_chr = Str_chr & ChrB(Source((i + 1) / 2)) Next i If Sytle = "hex" Or Sytle = "Hex" Or Sytle = "HEX" Then '判断是不是要输出机器码 Str_UTF_8 = Str_utf_hex Else Str_UTF_8 = Str_chr End If End Function '二进制转16进制函数 Public Function B_To_H(ByVal Bininary_in As String) As String Dim i As Long Dim H As String If Len(Bininary_in) Mod 4 <> 0 Then Bininary_in = String(4 - Len(Bininary_in) Mod 4, "0") & Bininary_in End If For i = 1 To Len(Bininary_in) Step 4 Select Case Mid(Bininary_in, i, 4) Case "0000": H = H & "0" Case "0001": H = H & "1" Case "0010": H = H & "2" Case "0011": H = H & "3" Case "0100": H = H & "4" Case "0101": H = H & "5" Case "0110": H = H & "6" Case "0111": H = H & "7" Case "1000": H = H & "8" Case "1001": H = H & "9" Case "1010": H = H & "A" Case "1011": H = H & "B" Case "1100": H = H & "C" Case "1101": H = H & "D" Case "1110": H = H & "E" Case "1111": H = H & "F" End Select Next i B_To_H = H End Function '16进制转二进制函数 Public Function H_To_B(ByVal hex_str As String, MinimumDigits As Integer) As String Dim i As Long Dim B As String Dim ExtraDigitsNeeded As Integer hex_str = UCase(hex_str) For i = 1 To Len(hex_str) Select Case Mid(hex_str, i, 1) Case "0": B = B & "0000" Case "1": B = B & "0001" Case "2": B = B & "0010" Case "3": B = B & "0011" Case "4": B = B & "0100" Case "5": B = B & "0101" Case "6": B = B & "0110" Case "7": B = B & "0111" Case "8": B = B & "1000" Case "9": B = B & "1001" Case "A": B = B & "1010" Case "B": B = B & "1011" Case "C": B = B & "1100" Case "D": B = B & "1101" Case "E": B = B & "1110" Case "F": B = B & "1111" End Select Next i ExtraDigitsNeeded = MinimumDigits - Len(B) If ExtraDigitsNeeded > 0 Then B = String(ExtraDigitsNeeded, "0") & B End If H_To_B = B End Function