VBA Tipp: ISO-Textdatei ins UTF8-Format konvertieren

Aus DBWiki
Wechseln zu: Navigation, Suche

Anforderung

Ich möchte eine in Windows oder in Access erstellte Textdatei vom ANSI-Format (ISO-Format) ins UTF8-Format wahlweise mit oder ohne BOM (Byte Order Mark) konvertieren.
Hinweis: Der ISO-Zeichensatz ist nahezu identisch mit dem ANSI-Zeichensatz.

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.

In der Funktion werden zwei weitere Funktionen aus dem DBWiki verwendet:

Public Function ANSIzuUTF8Datei(ByVal Dateipfad As String, _
                                Optional ByVal ohneBOM As Boolean = False _
                                ) As Boolean
 
 'Konvertiert eine ANSI-Text-Datei ins UTF8-Format
 'Late-Binding, kein Verweis auf Microsoft ActiveX Data Objects X.X Library (ADO) notwendig
 'Quelle: www.dbwiki.net oder www.dbwiki.de
 
 Dim objStreamUTF8 As Object 'ADODB.Stream
 Dim objStreamANSI As Object 'ADODB.Stream
 Dim strText As String
 Const adTypeText = 2
 Const adSaveCreateOverWrite = 2
 
 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
 
 'Text in gleicher Datei speichern, Datei wird überschrieben
 objStreamUTF8.SaveToFile Dateipfad, adSaveCreateOverWrite
 
 'BOM (, entspricht den Zeichen 239 187 191) entfernen
 If ohneBOM = True Then
 
   'Dateiinhalt auslesen
   strText = DateiAuslesen(Dateipfad)
 
   'BOM (, entspricht den Zeichen 239 187 191) entfernen
   strText = Replace(strText, Chr(239) & Chr(187) & Chr(191), "", , , vbBinaryCompare)
 
   'String in Datei schreiben
   Call InDateiSchreiben(Dateipfad, strText)
 
 End If
 
 'Objekte schließen und Speicher leeren
 objStreamUTF8.Close: Set objStreamUTF8 = Nothing
 objStreamANSI.Close: Set objStreamANSI = Nothing
 
 'Rückgabewerte setzen
 If err Then
   ANSIzuUTF8Datei = False
 Else
   ANSIzuUTF8Datei = True
 End If
 
 On Error GoTo 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


Wiki-Links