在VB中,如何把txt文件转换成UTF-8格式的文件?如何把文字转换成UTF-8的格式呢?我现在转换的结果文字是乱码,为什么?

解决方案 »

  1.   

    在论坛内部搜索"utf-8" or "utf8",应该有很多这样的代码
      

  2.   

    老外的转换代码Option ExplicitPublic Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpDefaultChar As String, ByVal lpUsedDefaultChar As Long) As Long
    Public 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
    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)Public Const CP_UTF8 = 65001'Purpose:Convert Utf8 to Unicode
    Public Function UTF8_Decode(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   If m_bIsNt Then
          On Error GoTo EndFunction
          bytUtf8 = StrConv(sUTF8, vbFromUnicode)
          lngUtf8Size = UBound(bytUtf8) + 1
          On Error GoTo 0
          'Set buffer for longest possible string i.e. each byte is
          'ANSI, thus 1 unicode(2 bytes)for every utf-8 character.
          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
             UTF8_Decode = Left$(strBuffer, lngResult)
          End If
       Else
          Dim i                As Long
          Dim TopIndex         As Long
          Dim TwoBytes(1)      As Byte
          Dim ThreeBytes(2)    As Byte
          Dim AByte            As Byte
          Dim TStr             As String
          Dim BArray()         As Byte      'Resume on error in case someone inputs text with accents
          'that should have been encoded as UTF-8
          On Error Resume Next      TopIndex = Len(sUTF8)  ' Number of bytes equal TopIndex+1
          If TopIndex = 0 Then Exit Function ' get out if there's nothing to convert
          BArray = StrConv(sUTF8, vbFromUnicode)
          i = 0 ' Initialise pointer
          TopIndex = TopIndex - 1
          ' Iterate through the Byte Array
          Do While i <= TopIndex
             AByte = BArray(i)
             If AByte < &H80 Then
                ' Normal ANSI character - use it as is
                TStr = TStr & Chr$(AByte): i = i + 1 ' Increment byte array index
             ElseIf AByte >= &HE0 Then         'was = &HE1 Then
                ' Start of 3 byte UTF-8 group for a character
                ' Copy 3 byte to ThreeBytes
                ThreeBytes(0) = BArray(i): i = i + 1
                ThreeBytes(1) = BArray(i): i = i + 1
                ThreeBytes(2) = BArray(i): i = i + 1
                ' Convert Byte array to UTF-16 then Unicode
                TStr = TStr & ChrW$((ThreeBytes(0) And &HF) * &H1000 + (ThreeBytes(1) And &H3F) * &H40 + (ThreeBytes(2) And &H3F))
             ElseIf (AByte >= &HC2) And (AByte <= &HDB) Then
                ' Start of 2 byte UTF-8 group for a character
                TwoBytes(0) = BArray(i): i = i + 1
                TwoBytes(1) = BArray(i): i = i + 1
                ' Convert Byte array to UTF-16 then Unicode
                TStr = TStr & ChrW$((TwoBytes(0) And &H1F) * &H40 + (TwoBytes(1) And &H3F))
             Else
                ' Normal ANSI character - use it as is
                TStr = TStr & Chr$(AByte): i = i + 1 ' Increment byte array index
             End If
          Loop
          UTF8_Decode = TStr    ' Return the resultant string
          Erase BArray
       End IfEndFunction:End Function'Purpose:Convert Unicode string to UTF-8.
    Public Function UTF8_Encode(ByVal strUnicode As String, Optional ByVal bHTML As Boolean = True) As String
       Dim i                As Long
       Dim TLen             As Long
       Dim lPtr             As Long
       Dim UTF16            As Long
       Dim UTF8_EncodeLong  As String   TLen = Len(strUnicode)
       If TLen = 0 Then Exit Function   If m_bIsNt Then
          Dim lngBufferSize    As Long
          Dim lngResult        As Long
          Dim bytUtf8()        As Byte
          'Set buffer for longest possible string.
          lngBufferSize = TLen * 3 + 1
          ReDim bytUtf8(lngBufferSize - 1)
          'Translate using code page 65001(UTF-8).
          lngResult = WideCharToMultiByte(CP_UTF8, 0, StrPtr(strUnicode), _
             TLen, bytUtf8(0), lngBufferSize, vbNullString, 0)
          'Trim result to actual length.
          If lngResult Then
             lngResult = lngResult - 1
             ReDim Preserve bytUtf8(lngResult)
             'CopyMemory StrPtr(UTF8_Encode), bytUtf8(0&), lngResult
             UTF8_Encode = StrConv(bytUtf8, vbUnicode)
             ' For i = 0 To lngResult
             '    UTF8_Encode = UTF8_Encode & Chr$(bytUtf8(i))
             ' Next
          End If
       Else
          For i = 1 To TLen
             ' Get UTF-16 value of Unicode character
             lPtr = StrPtr(strUnicode) + ((i - 1) * 2)
             CopyMemory UTF16, ByVal lPtr, 2
             'Convert to UTF-8
             If UTF16 < &H80 Then                                      ' 1 UTF-8 byte
                UTF8_EncodeLong = Chr$(UTF16)
             ElseIf UTF16 < &H800 Then                                 ' 2 UTF-8 bytes
                UTF8_EncodeLong = Chr$(&H80 + (UTF16 And &H3F))              ' Least Significant 6 bits
                UTF16 = UTF16 \ &H40                                   ' Shift right 6 bits
                UTF8_EncodeLong = Chr$(&HC0 + (UTF16 And &H1F)) & UTF8_EncodeLong  ' Use 5 remaining bits
             Else                                                      ' 3 UTF-8 bytes
                UTF8_EncodeLong = Chr$(&H80 + (UTF16 And &H3F))              ' Least Significant 6 bits
                UTF16 = UTF16 \ &H40                                   ' Shift right 6 bits
                UTF8_EncodeLong = Chr$(&H80 + (UTF16 And &H3F)) & UTF8_EncodeLong  ' Use next 6 bits
                UTF16 = UTF16 \ &H40                                   ' Shift right 6 bits
                UTF8_EncodeLong = Chr$(&HE0 + (UTF16 And &HF)) & UTF8_EncodeLong   ' Use 4 remaining bits
             End If
             UTF8_Encode = UTF8_Encode & UTF8_EncodeLong
          Next
       End If   'Substitute vbCrLf with HTML line breaks if requested.
       If bHTML Then
          UTF8_Encode = Replace$(UTF8_Encode, vbCrLf, "<br>")
       End IfEnd Function
    另外,utf-8码的东西看起来本来就是乱码样的
      

  3.   

    在VB里引用并定义一个word对象,最好是word2002及以上,把txt文件用word打开,然后用word保存成txt文件,保存时设定编码为UTF-8就可以了
      

  4.   

    Dim myStream As New ADODB.Stream
    dim cnvUni as String    cnvUni = "asdfasdjf;safdj;sadkf我是中国人。"    
        myStream.Charset = "UTF-8"
        myStream.Open
        myStream.WriteText cnvUni
        myStream.SaveToFile "f:\temp1.txt", adSaveCreateNotExist
        myStream.Close