zeichensaetze_konvertieren
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| zeichensaetze_konvertieren [2013-10-21 13:01:34] – manfred | zeichensaetze_konvertieren [2024-11-22 10:07:25] (aktuell) – [dos2unix] manfred | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== Zeichensätze konvertieren ====== | ||
| + | |||
| + | Siehe auch [[Dateiformate konvertieren]] und [[Byte Order Mark - BOM]] | ||
| + | |||
| + | * [[http:// | ||
| + | |||
| + | |||
| + | ==== convmv ==== | ||
| + | |||
| + | Dieses Werkzeug dient zur Umwandlung von Dateinamen. | ||
| + | |||
| + | |||
| + | ==== sed ==== | ||
| + | |||
| + | DOS-Zeilenenden zu Unix-Zeilenenden umwandeln: | ||
| + | > sed -i ' | ||
| + | |||
| + | Unix-Zeilenenden zu DOS-Zeilenenden umwandeln: | ||
| + | > sed -i ' | ||
| + | |||
| + | |||
| + | ==== dos2unix ==== | ||
| + | |||
| + | Wenn man unter DOS/Windows eine Textdatei erstellt, dann enthält sie am Zeilenende das // | ||
| + | Um es zu entfernen, kann man im einfachsten Fall das folgende Kommando ausführen: | ||
| + | # tr -d \\r < dosfile > newfile | ||
| + | # cat dosfile | tr -d ' | ||
| + | |||
| + | Es ist aber auch möglich den Befehl " | ||
| + | |||
| + | Installiert werden diese Befehle in **FreeBSD** mit: | ||
| + | # portinstall -prO converters/ | ||
| + | # pkg install dosunix | ||
| + | # pkg install dos2unix | ||
| + | |||
| + | Installiert werden diese Befehle in **Ubuntu** mit: | ||
| + | # apt install dos2unix | ||
| + | |||
| + | Datei in **FreeBSD** vom DOS-Format ins Unix-Format überführen: | ||
| + | # dosunix datei | ||
| + | |||
| + | Datei in **FreeBSD** vom Unix-Format ins DOS-Format überführen: | ||
| + | # unixdos datei | ||
| + | |||
| + | Installiert werden diese Befehle in **Ubuntu** mit: | ||
| + | # apt install tofrodos | ||
| + | |||
| + | Datei in **Ubuntu** vom DOS-Format ins Unix-Format überführen: | ||
| + | # fromdos datei | ||
| + | |||
| + | Datei in **Ubuntu** vom Unix-Format ins DOS-Format überführen: | ||
| + | # todos datei | ||
| + | |||
| + | |||
| + | ==== iconv ==== | ||
| + | |||
| + | **'' | ||
| + | > iconv -f ISO-8859-15 -t UTF-8 -o utf8datei.txt isodatei.txt | ||
| + | |||
| + | Mir ist leider kein Werkzeug bekannt, mit dem man automatisch in einem Skript, den verwendeten Zeichensatz in einer Datei erkennen kann. | ||
| + | |||
| + | Aber glücklicherweise gibt **'' | ||
| + | Mit diesem Wissen kann man sich einen Zeichensatzdetektor (für die relevanten Fälle) selber bauen, der allerdings nur erkennen kann, welcher Zeichensatz überhauptnicht passen kann. | ||
| + | |||
| + | In diesem Beispiel wollen wir als Ergebnis ein Datei im UTF8-Format haben und wir wissen, wenn sie nicht in der UTF8-Kodierung vorliegt, dann liegt sie in der ISO-8859-1-Kodierung vor. | ||
| + | Einen " | ||
| + | |||
| + | hier probieren wir die beiden bekannten Zeichensatzkodierungen an einer ISO-8859-1 kodierten Datei aus: | ||
| + | > cat / | ||
| + | 167 | ||
| + | | ||
| + | > cat / | ||
| + | iconv: ungültige Eingabe-Sequenz an der Stelle 119 | ||
| + | | ||
| + | | ||
| + | > cat / | ||
| + | 4194 | ||
| + | | ||
| + | > cat / | ||
| + | iconv: ungültige Eingabe-Sequenz an der Stelle 119 | ||
| + | 119 | ||
| + | |||
| + | Kodekombinationen, | ||
| + | |||
| + | hier probieren wir die beiden bekannten Zeichensatzkodierungen an einer UTF-8 kodierten Datei aus: | ||
| + | > cat / | ||
| + | 168 | ||
| + | | ||
| + | > cat / | ||
| + | 168 | ||
| + | | ||
| + | > cat / | ||
| + | 4107 | ||
| + | | ||
| + | > cat / | ||
| + | 4028 | ||
| + | |||
| + | Hier gibt es keine Fehlermeldungen und so müssen wir die Dateilänge in Byte oder Zeichen messen. | ||
| + | __Richtig ist hier die kleinere Zahl, weil die Sonderzeichen im UTF-8-Zeichensatz doppelt so lang sind, wie im ISO-8859-1-Zeichensatz.__ | ||
| + | |||
| + | Ein " | ||
| + | Werden also diese 16 Byte mit ISO-8859-1 dekodiert, müssen zwei Zeichen dabei rauskommen. | ||
| + | |||
| + | |||
| + | === Zeichensatzkodierung per Skript erkennen === | ||
| + | |||
| + | * [[http:// | ||
| + | |||
| + | Es ist aber möglich eine zutreffende Zeichensatzkodierung zu finden, wenn man ein Wort mit Sonderzeichen aus der entsprechenden Datei kennt. | ||
| + | Dann kann man einfach alle Zeichensatzkodierungen durchprobieren, | ||
| + | Genau das wird in dem folgenden Skript getan. | ||
| + | |||
| + | < | ||
| + | #!/bin/bash | ||
| + | # | ||
| + | # encoding-finder.sh | ||
| + | # (C) GPLv3, Stefan Wagner 2007 | ||
| + | # | ||
| + | ### | ||
| + | ### In einer Datei einen bekannten (Teil-)String (z.B.: Begrüßung) suchen, | ||
| + | ### indem alle Encodings ausprobiert werden. | ||
| + | ### | ||
| + | # | ||
| + | # angepasst von Manfred Heins am 18. Okt. 2013 | ||
| + | # so das nur die ISO-8859-, UTF- und WINDOWS-Zeichensatzkodierungen ausprobiert werden | ||
| + | # | ||
| + | [[ $# -ne 2 ]] && echo " | ||
| + | FILE=" | ||
| + | PATTERN=" | ||
| + | for enc in $( iconv -l | sed ' | ||
| + | do | ||
| + | iconv -f " | ||
| + | done | head -n1 | ||
| + | </ | ||
| + | |||
| + | Hier werden allerdings nur die gebräuchlichen ISO-8859- und UTF-Zeichensatzkodierungen ausprobiert und nur der erste Treffer wird ausgegeben, das ist für die automatische Verwendung in Skripten besser geeignet. | ||
| + | |||
| + | |||
| + | ==== Zeichensatz_konvertieren_nach_UTF8 ==== | ||
| + | |||
| + | > vi Zeichensatz_konvertieren_nach_UTF8.sh | ||
| + | < | ||
| + | # | ||
| + | |||
| + | # | ||
| + | # Dieses Skript konvertiert alle Dateien in einen anderen Zeichensatz, | ||
| + | # dessen Inhalt erst den angegeben Pattern enthält, wenn er konvertiert wurde. | ||
| + | # Der richtige Zeichensatz wird dabei durch ausprobieren ermittelt. | ||
| + | # Es werden hier aber NICHT alle möglichen Zeichensätze ausprobiert, | ||
| + | # so das nur die ISO-8859-, UTF- und WINDOWS-Zeichensatzkodierungen ausprobiert werden | ||
| + | # | ||
| + | # Meine Inspiration für dieses Skript habe ich von hier: | ||
| + | # http:// | ||
| + | # | ||
| + | VERSION=" | ||
| + | |||
| + | ### Hilfe | ||
| + | [[ $# -ne 2 ]] && echo " | ||
| + | |||
| + | ### alle brauchbaren Zeichensatzkodierungen ermitteln | ||
| + | DATEIPFAD=" | ||
| + | PATTERN=" | ||
| + | DATEIVERZ=" | ||
| + | DATEINAME=" | ||
| + | cd ${DATEIVERZ}/ | ||
| + | ZEICHENSATZKODIERUNGEN=" | ||
| + | do | ||
| + | iconv -f " | ||
| + | done)" | ||
| + | |||
| + | # | ||
| + | ### weitere Tests | ||
| + | |||
| + | ### Werte für den Plausibilitätstest generieren | ||
| + | AUSGABE=" | ||
| + | for KODIERUNG in ${ZEICHENSATZKODIERUNGEN} | ||
| + | do | ||
| + | if [ " | ||
| + | DEKODIERTERINHALT=" | ||
| + | if [ " | ||
| + | ZEICHENANZAHL=" | ||
| + | echo " | ||
| + | else | ||
| + | echo "' | ||
| + | fi | ||
| + | else | ||
| + | echo "' | ||
| + | fi | ||
| + | done | ||
| + | )" | ||
| + | |||
| + | ### Plausibilitätstest ermittelt die passenste Zeichensatzkodierung | ||
| + | TREFFER=" | ||
| + | QUELLZS=" | ||
| + | |||
| + | ### Konvertierung | ||
| + | if [ -n " | ||
| + | iconv -f ${QUELLZS} -t UTF-8 -o neu_utf8.txt ${DATEINAME} && (sed -i ' | ||
| + | fi | ||
| + | </ | ||
| + | |||
| + | Wenn wir beispielsweise zwei Dateien nehmen, eine dessen Inhalt ISO-8859-1 kodiert ist und eine, die UTF-8 kodiert ist: | ||
| + | > ls -lh | ||
| + | -rw-r--r-- 1 fritz fritz 4,1K Okt 18 12:18 test_iso88591.txt | ||
| + | -rw-r--r-- 1 fritz fritz 4,1K Okt 18 12:18 test_utf8.txt | ||
| + | |||
| + | Dann wird von diesem Skript nur die ISO-8859-1 kodierte Datei konvertiert: | ||
| + | > ./ | ||
| + | " | ||
| + | " | ||
| + | | ||
| + | > ./ | ||
| + | | ||
| + | > ls -lh | ||
| + | -rw-r--r-- 1 fritz fritz 4,2K Okt 18 16:58 test_iso88591.txt | ||
| + | -rw-r--r-- 1 fritz fritz 4,1K Okt 18 12:18 test_iso88591.txt_20131018165849 | ||
| + | -rw-r--r-- 1 fritz fritz 4,1K Okt 18 12:18 test_utf8.txt | ||
| + | |||
