iconv illegale Eingabesequenz - warum?

13

Beim Versuch, eine Textdatei in ihr ASCII-Äquivalent zu konvertieren, erhalte ich die Fehlermeldung iconv: illegal input sequence at position.

Befehl, den ich benutze, ist iconv -f UTF-8 -t ascii//TRANSLIT file

Der beleidigende Charakter ist æ.

Die Textdatei selbst ist hier vorhanden .

Warum heißt es unzulässige Reihenfolge? Das Eingabezeichen ist das richtige UTF-8-Zeichen (U + 00E6).

user13107
quelle

Antworten:

16

Die Datei ist in ISO-8859-1 codiert, nicht in UTF-8:

$ hd 0606461.txt | grep -B1 '^0002c520'
0002c510  64 75 6d 20 66 65 72 69  65 6e 74 20 72 75 69 6e  |dum ferient ruin|
0002c520  e6 0d 0a 2d 2d 48 6f 72  61 63 65 2e 0d 0a 0d 0a  |...--Horace.....|

Und das Byte "e6" allein ist keine gültige UTF-8-Sequenz.

Also, benutze iconv -f latin1 -t ascii//TRANSLIT file.

vinc17
quelle
Wie kann man herausfinden, welches Byte dem beleidigenden Zeichen entspricht? Ich habe versucht, hexdump -C fileBefehl und bekam 0002b220 72 75 69 6e e6 0a 20 2d 2d 20 48 6f 72 61 63 65 |ruin.. -- Horace|als Ausgabe.
user13107
1
In dem, was Sie haben, können Sie sehen, dass das einzige Byte mit der höchsten Bitmenge (ein Byte, dessen hexadezimaler Wert ≥ 80 ist) e6 ist. Dies entspricht keiner gültigen UTF-8-Sequenz (in UTF-8 benötigen Nicht-ASCII-Zeichen mindestens 2 Top-Bit-Set-Bytes). In ISO-8859-1 ist e6 die Kodierung des Zeichens "æ", das dem erwarteten Text entspricht. Dies bestätigt also, dass die ISO-8859-1-Codierung (oder eine ähnliche) für diese Datei verwendet wird.
Vinc17
5

Die von Ihnen verknüpfte Datei scheint in einem HTML-Dokument UTF-8 zu sein

$ file 0606461.txt 
0606461.txt: HTML document, ASCII text, with CRLF line terminators

Wenn Sie es zuerst über einen HTML-zu-Text-Konverter ausführen, z

iconv -f UTF-8 -t ascii//TRANSLIT < <(html2text 0606461.txt)

dann scheint das UTF-8-Fragment, mit dem Sie Probleme zu haben scheinen, fehlerfrei zu transliterieren, d. h

Si fractus illabatur orbis.
Impavidum ferient ruinæ
--Horace.

wird

Si fractus illabatur orbis.
Impavidum ferient ruinae
--Horace.

Das html2textDienstprogramm ist möglicherweise nicht auf Ihrem System installiert. Wenn Sie es nicht finden / installieren können, gibt es andere Konverter, einschließlich eines Python-Moduls.

Stahlfahrer
quelle
Nein, die Datei ist nicht in UTF-8, sondern in ISO-8859-1 codiert. Übrigens, der fileBefehl sagt ASCII, aber der Grund ist, dass nur der Anfang der Datei angezeigt wird und das ISO-8859-1-Zeichen weit entfernt an Position 181536 erscheint.
vinc17
@ vinc17 wie hast du herausgefunden, dass die datei in iso-8859 ist?
user13107
1
@ user13107 anhand der Codierung des beleidigenden Zeichens: Es handelt sich um das Byte "e6" und nicht um die UTF-8-Sequenz "c3 a6". Emacs hat die Datei auch als ISO-8859-1 erkannt.
Vinc17