FAQ 0155: Wie konvertiere ich eine VB-Zeichenkette nach UTF-8 oder zurück?
von Philipp Stephani
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.