VBA Tipp: ISO-Textdatei ins UTF8-Format konvertieren

Aus DBWiki
Wechseln zu: Navigation, Suche

Anforderung

Ich möchte eine in Windows-1252 (Westeuropäisch), bzw. ISO 8859-1 (Latin-1) oder ISO 8859-15 (Latin-9) kodierte Textdatei in das Unicode-Format UTF-8 wahlweise mit oder ohne Byte Order Mark (BOM) konvertieren.
Hinweis: Der Windows-1252-Zeichensatz enthält alle fehlenden Zeichen von ISO/IEC 8859-15 sowie eine Reihe typografischer Symbole, wobei die selten verwendeten C1-Steuerzeichen im Bereich von 128 bis 159 (hex 80 bis 9F) ersetzt wurden.

Lösung

Das geht mit der folgenden Funktion, die in einem globalen Modul hinterlegt wird.
Mit der Funktion können alle Arten von Textdateien umgewandelt werden, z.B. .txt, .php.

Public Function AnsiZuUtf8Datei(Dateipfad As String, _
                                Optional ByVal ohneBOM As Boolean) As Boolean
 
   'Konvertiert eine ANSI-Text-Datei ins UTF8-Format
   'verwendet Late-Binding, weswegen kein Verweis auf
   'Microsoft ActiveX Data Objects X.X Library (ADO) notwendig ist
 
   'Quelle: www.dbwiki.net oder www.dbwiki.de
 
   Const adTypeBinary          As Long = 1
   Const adTypeText            As Long = 2
 
   Const adSaveCreateOverWrite As Long = 2
 
   Dim objStreamUtf8           As Object   'ADODB.Stream
   Dim objStreamAnsi           As Object   'ADODB.Stream
   Dim objStreamOhneBOM        As Object   'ADODB.Stream
 
   On Error Resume Next
 
   Set objStreamAnsi = CreateObject("ADODB.Stream")
   Set objStreamUtf8 = CreateObject("ADODB.Stream")
 
   'Streamobjekt Quelle öffnen, Kodierung ANSI-Text
   objStreamAnsi.Type = adTypeText
   objStreamAnsi.Charset = "windows-1252"
   objStreamAnsi.Open
 
   'ANSI-Textdatei-Inhalt hereinladen
   objStreamAnsi.LoadFromFile Dateipfad
 
   'Streamobjekt Ziel öffnen, Kodierung UTF8-Text
   objStreamUtf8.Type = adTypeText
   objStreamUtf8.Charset = "utf-8"
   objStreamUtf8.Open
 
   'Text vom Streamobjekt Quelle ins Streamobjekt Ziel kopieren
   objStreamUtf8.WriteText objStreamAnsi.ReadText
 
   'ohne Byte Order Mark speichern
   If ohneBOM Then
 
      'neues Stream-Objekt anlegen
      Set objStreamOhneBOM = CreateObject("ADODB.Stream")
      'öffnen
      objStreamOhneBOM.Open
      'als Binär-Typ auslegen
      objStreamUtf8.Type = adTypeBinary
 
      'Position hint BOM setzen
      objStreamUtf8.Position = 3
      'Stream ab Position kopieren
      objStreamUtf8.CopyTo objStreamOhneBOM
      'Stream speichern (Datei wird überschrieben)
      objStreamOhneBOM.SaveToFile Dateipfad, adSaveCreateOverWrite
      'und schließen
      objStreamOhneBOM.Close
 
   Else
 
      'UTF8-Text in gleiche Datei speichern (Datei wird überschrieben)
      objStreamUtf8.SaveToFile Dateipfad, adSaveCreateOverWrite
 
   End If
 
   'Objekte schließen
   objStreamUtf8.Close
   objStreamAnsi.Close
 
   'Rückgabewert setzen
   AnsiZuUtf8Datei = CBool(Err.Number = 0)
 
End Function


Aufruf als Prozedur

Die Datei wird umgewandelt, falls kein Fehler auftritt.

   Dim strPfad As String
 
   'Beispiel 1: Textdatei umwandeln mit BOM
   strPfad = "C:\Eigene Dateien\MeineTextdatei.txt"
   Call ANSIzuUTF8Datei(strPfad)
 
   'Beispiel 2: Eine mit Access erstellte php-Datei umwandeln ohne BOM
   strPfad = "C:\Eigene Dateien\MeinePHPdatei.php"
   Call ANSIzuUTF8Datei(strPfad, True)


Aufruf als Funktion

Die Funktion gibt den Wert "True" zurück, wenn die Datei erfolgreich umgewandelt wurde, ansonsten "False".

   Dim strPfad As String
 
   strPfad = "C:\Eigene Dateien\MeineTextdatei.txt"
 
   If ANSIzuUTF8Datei(strPfad) = True Then
      MsgBox "Die Konvertierung war erfolgreich!"
   Else
      MsgBox "Die Konvertierung ist fehlgeschlagen!"
   End If

Wikilinks