ADMIN-Tipp: Byte Order Mark in UTF-8

Jede Woche erscheint in unserem Newsletter ein neuer ADMIN-Tipp. Eine Sammlung aller Tipps finden Sie im Archiv der ADMIN-Tipps.

Eine weitere Folge aus der Reihe "Unsichtbare Zeichen machen großen Ärger" beschäftigt sich mit dem berüchtigten BOM in Unicode-Dateien.

Neulich musste ich in PHP-Skript schreiben, das unter anderem einen Link auf einer Videodatei erzeugen sollte. Aus zunächst unerfindlichen Gründen wollte und wollte das nicht funktionieren. Den Pfad mit "print()" auszugeben, gab aber auch keinen weiteren Aufschluss über das Problem, alles sah vollkommen normal und korrekt aus:

/sites/www.admin-magazin.de/files/S24142/01.mp4

Sehen Sie hier ein Problem? Ich jedenfalls nicht. Um ganz sicherzugehen, kopierte ich den Pfad dann in den Editor, um ihn noch einmal zeichenweise mit dem aus dem anderen Terminal kopierten Pfad des Dateisystems zu vergleichen. Da war dann auch schon der Fehler. In Wirklichheit sah der String nämlich so aus:

 /sites/www.admin-magazin.de/files/S24142/<feff>01.mp4

FEFF ist als Unicode-Zeichen der sogenannte Byte Order Mark (BOM), der die Byte-Reihenfolge (Big/Little Endian) einer Unicode-Datei kennzeichnet, im konkreten Fall der UTF-8-Datei in der die Pfadinformationen gespeichert waren. Das Kommando "file" verriet weiterhin, dass die von den Benutzern hochgeladenen Dateien unterschiedlich kodiert waren, je nachdem, welches Betriebssystem und welchen Editor sie benutzt hatten.

find -name "parts.txt" | xargs file
./S24128/parts.txt: ASCII text, with CRLF line terminators
./S23774/parts.txt: ASCII text
./S22010/parts.txt: UTF-8 Unicode text
./S24125/parts.txt: ASCII text, with CRLF line terminators
./S24175/parts.txt: UTF-8 Unicode (with BOM) text
./S24177/parts.txt: UTF-8 Unicode (with BOM) text, with CRLF lineterminators

Wie man sieht, ein bunter Zoo von Zeichencodierungen, mit etwa allem, was es heute gibt. Fehlt nur noch EBCDIC, aber wenigstens verwendet hier niemand einen IBM-Großrechner...

Ist das Problem erst einmal erkannt, lässt es sich recht leicht lösen. Zum Beispiel entfernt der folgende Sed-Aufruf den Byte Order Mark aus der Datei:

sed -i -e '1s/^\xEF\xBB\xBF//' Datei

Alternativ kann dies auch das kleine Tool "bomstrip" erledigen, das zum Beispiel in den Repositories von Ubuntu-Distributionen enthalten ist.

23.04.2013

Ähnliche Artikel

comments powered by Disqus

Artikel der Woche

Loadtests ohne Server

Für Loadtests der eigenen Server bietet sich die Cloud an, denn kurz getaktet lassen sich dort viele Rechnerinstanzen starten, die das eigene Budget nur wenig belasten. Noch flexibler, günstiger und besser skalierbar sind Tests mit einer Serverless-Infrastruktur wie AWS Lambda. Wir führen vor, wie Sie dort mit Serverless Artillery eigene Loadtests starten. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Container

Wie setzen Sie Container ein?

  • Gar nicht
  • Docker standalone
  • Docker mit Kubernetes
  • Docker mit Swarm
  • Docker mit anderem Management
  • LXC/LXD
  • Rocket
  • CRI-O auf Kubernetes
  • Container auf vSphere
  • Andere (siehe Kommentare auf der Ergebnisseite)

Google+

Ausgabe /2018