Die Community zu .NET und Classic VB.
Menü

FAQ 0155: Wie konvertiere ich eine VB-Zeichenkette nach UTF-8 oder zurück?

 von 

Frage 

Wie kann ich eine Zeichenkette aus dem Zeichensatz Windows-ANSI nach UTF-8 konvertieren?

Wie kann ich eine Zeichenkette aus dem Zeichensatz UTF-8 nach Windows-ANSI konvertieren?

Antwort  

UTF-8 ist eine der am häufigsten verwendeten Unicode-Kodierungen. Eine Einführung in die wichtigsten Unicode-Begriffe findet sich in Unicode [Kolumne 0020]. VB unterstützt UTF-8 jedoch nicht direkt, sodaß beispielsweise beim Einlesen von Dateien „seltsame Zeichen“ (z.B. Ä anstelle von Ä) auftauchen. VB verwendet für seinen String-Datentyp die Unicode-Kodierung UTF-16. Da alle Unicode-Strings verlustfrei in allen Kodierungen dargestellt werden können, stellt die Konversion von UTF-16 nach UTF-8 kein Problem dar. Sie wird am einfachsten mit den API-Funktionen MultiByteToWideChar und WideCharToMultiByte realisiert:

Option Explicit

Private Declare Function WideCharToMultiByte Lib "kernel32.dll" ( _
                         ByVal CodePage As Long, _
                         ByVal dwFlags As Long, _
                         ByVal lpWideCharStr As Long, _
                         ByVal cchWideChar As Long, _
                         ByVal lpMultiByteStr As Long, _
                         ByVal cbMultiByte As Long, _
                         ByVal lpDefaultChar As Long, _
                         ByVal lpUsedDefaultChar As Long) As Long
                         
Private Declare Function MultiByteToWideChar Lib "kernel32.dll" ( _
                         ByVal CodePage As Long, _
                         ByVal dwFlags As Long, _
                         ByVal lpMultiByteStr As Long, _
                         ByVal cbMultiByte As Long, _
                         ByVal lpWideCharStr As Long, _
                         ByVal cchWideChar As Long) As Long
                         
Private Const CP_UTF8 As Long = 65001&

Private Function ConvertToUTF8(ByRef Source As String) As Byte()

    Dim Length As Long
    Dim Pointer As Long
    Dim Size As Long
    Dim Buffer() As Byte
    
    Length = Len(Source)
    Pointer = StrPtr(Source)
    Size = WideCharToMultiByte(CP_UTF8, 0, Pointer, Length, 0, 0, 0, 0)
    ReDim Buffer(0 To Size - 1)
    
    WideCharToMultiByte CP_UTF8, 0, Pointer, Length, VarPtr(Buffer(0)), _
        Size, 0, 0
        
    ConvertToUTF8 = Buffer
    
End Function

Private Function ConvertFromUTF8(ByRef Source() As Byte) As String

    Dim Size As Long
    Dim Pointer As Long
    Dim Length As Long
    Dim Buffer As String
    
    Size = UBound(Source) - LBound(Source) + 1
    Pointer = VarPtr(Source(LBound(Source)))
    Length = MultiByteToWideChar(CP_UTF8, 0, Pointer, Size, 0, 0)
    Buffer = Space$(Length)
    MultiByteToWideChar CP_UTF8, 0, Pointer, Size, StrPtr(Buffer), Length
    ConvertFromUTF8 = Buffer
    
End Function

Private Function ReadUTF8File(ByRef FileName As String) As String

    Dim FileNumber As Integer
    Dim Buffer() As Byte
    
    FileNumber = FreeFile
    Open FileName For Binary Access Read As #FileNumber
    ReDim Buffer(0 To LOF(FileNumber) - 1)
    Get #FileNumber, , Buffer
    Close #FileNumber
    ReadUTF8File = ConvertFromUTF8(Buffer)
    
End Function

Private Sub WriteUTF8File(ByRef FileName As String, ByRef Contents As _
    String)
    
    Dim FileNumber As Integer
    Dim Buffer() As Byte
    
    Buffer = ConvertToUTF8(Contents)
    FileNumber = FreeFile
    Open FileName For Binary Access Write As #FileNumber
    Put #FileNumber, , Buffer
    Close #FileNumber
    
End Sub

Listing 1: Zeichenketten von und nach UTF-8 konvertieren

Ihre Meinung  

Falls Sie Fragen zu dieser FAQ haben, Ihre Erfahrung mit anderen Nutzern austauschen möchten oder auf eine Ergänzung hinweisen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Wie konvertiere ich mit VBA7? - Klaus 25.06.13 14:46 11 Antworten
Funktioniert unter XP Prof und Access 2003 nicht - wb3001 24.08.13 11:17 1 Antwort