Textdateien haben ein Encoding, das ist in unseren Breiten meist entweder
utf-8 oder iso-8859-1 (es gibt natürlich noch bedeutend mehr). Ein großes Problem entsteht, wenn Windows- und Linuxuser gemeinsam (deutschsprachige) Dateien bearbeiten. Dann kann es vorkommen, dass eine Textdatei sowohl utf-8, als auch iso-8859-1 Teile enthält.
Die Datei ist kaputt, Umlaute werden teilweise nicht mehr richtig angezeigt.
Was tun? Normalerweise müsste sich jetzt jemand hinsetzen und den gesamten Text durcharbeiten.
Nein, wir Tricksen!
Wir verwenden das Programm
recode, allerdings nicht direkt. Mit gemischtem Encoding kann recode nicht umgehen, sondern wir gehen den Umweg über HTML-Entities.
Wichtig: Folgendes findet auf einer Linuxkonsole mit $LANG=de_DE.UTF-8 statt:
Zuerst die Diagnose.
file identifiziert die kaputte Datei als "Non-ISO extended-ASCII text" (Naja, kaputt, eh klar.)
Rufe ich
cat totalkaputt.txt auf, sehe ich ein paar Umlaute, aber auch schwarz hinterlegte Fragezeichen.
-> Aha, teilweise utf-8, teilweise was anderes.
Öffne ich die Datei mit
less, sehe ich Umlaute, aber auch schwarz hinterlegte dreistellige Nummern.
-> Aha, da stecken auch iso-8859-1 Teile drin.
cat totalkaputt.txt | sed 's/ä/\ä/g; s/ü/\ü/g; s/ö/\ö/g; s/Ä/\Ä/g; s/Ü/\Ü/g; s/Ö/\Ö/g; s/ß/\ß/g;' | recode -d iso-8859-1..h4 | recode -d h4..
Das Ergebnis ist "reinrassiges" utf-8 mit allen Umlauten.
Der Trick schrittweise erklärt:
- sed ersetzt die noch-utf-8 Umlaute durch HTML-Entities (ä wird zu ä usw.), die iso-8859-1-Zeichen bleiben unangetastet.
- recode ersetzt die verbliebenen Umlaute (also iso!) (Option -d für "diacritics only") durch HTML-Entities
- recode ersetzt alle HTML-Entities durch utf-8-Zeichen
Puh, gerettet und viel Zeit gespart
Das muss natürlich stattfinden, bevor etwaige Rettungsversuche das Ganze "verschlimmbessert" haben.
blog.timomeinen.de am : PingBack
/dev/null am : Gemischtes Encoding einer Datei reparieren