UTF-8 Byte Order Mark setzen

Aus ZusiWiki
Version vom 27. Dezember 2022, 08:31 Uhr von AMeschede (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Nachträgliches Setzen des BOM unter Linux:

find . -type f | while read filename; do if file --mime-encoding $filename | grep -q us-ascii; then echo $filename; sed -i -e '1s/^/\xef\xbb\xbf/g' $filename; fi; done


Nachträgliches Setzen des BOM mit Windows Powershell:

dir -recurse -name -file | foreach { $t = [System.IO.File]::ReadAllText($_, [System.Text.Encoding]::Utf8) ; [System.IO.File]::WriteAllText($_, $t, [System.Text.Encoding]::Utf8) }

Erläuterung

Alle Zusi-XML-Dateien sollen UTF-8-codiert sein und enthalten eine entsprechende Deklaration im XML-Text. Die Zusi-Editoren erzeugen ihre Dateien mit dem Byte Order Mark, so dass für externe Tools eindeutig feststellbar ist, dass in UTF-8 codiert werden soll.

Probleme ergeben sich bei Zusi-XML-Dateien, die mit externen Texteditoren erzeugt wurden. Solange die Dateien noch keine Sonderzeichen wie deutsche Umlaute und keinen Byte Order Mark enthalten, sind sie sowohl gültiger ASCII-Text als auch gültiges UTF-8. Es gibt auch heute noch Editoren, die in so einem Fall dann von ASCII-Text ausgehen. Kritisch ist insbesondere der Fall, wenn in eine solche Datei nachträglich doch noch Sonderzeichen per externem Editor eingefügt werden sollen. Das Ergebnis ist dann in der Regel ein in Windows-1252 codierter Text. Dieser steht dann im Widerspruch zu der Deklaration encoding="UTF-8" im XML-Inhalt der Datei.

Solange die betroffenen Dateien noch reiner ASCII-Text sind, lassen sie sich mit dem obigen Kommando bereits vorsorglich als UTF-8 deklarieren, um externe Texteditoren frühzeitig auf die richtige Spur zu setzen.

Wenn das Kind im Teich liegt

Falls dennoch das Encoding von verteilt über den Bestand liegenden Dateien per Massenänderung korrigiert werden muss:

find . -not -path '*/\.*' -type f | while read filename; do if file --mime-encoding $filename | grep -q iso-8859-1; then echo $filename; recode ISO-8859-1..UTF8 $filename; fi; done