iconv nielegalna sekwencja wprowadzania - dlaczego?

14

Podczas próby przekonwertowania pliku tekstowego na jego odpowiednik ASCII pojawia się komunikat o błędzie iconv: illegal input sequence at position.

Polecenie, którego używam, to iconv -f UTF-8 -t ascii//TRANSLIT file

Obrażającą postacią jest æ.

Sam plik tekstowy jest tutaj obecny .

Dlaczego mówi nielegalna sekwencja? Znak wejściowy jest prawidłowy UTF-8 (U + 00E6).

użytkownik13107
źródło

Odpowiedzi:

17

Plik jest zakodowany w ISO-8859-1, a nie w 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.....|

A sam bajt „e6” nie jest prawidłową sekwencją UTF-8.

Więc użyj iconv -f latin1 -t ascii//TRANSLIT file.

vinc17
źródło
Jak dowiedzieć się, który bajt odpowiada postaci obrażającej? Próbowałem hexdump -C filepolecenia i otrzymałem 0002b220 72 75 69 6e e6 0a 20 2d 2d 20 48 6f 72 61 63 65 |ruin.. -- Horace|jako wyjście.
user13107,
1
W tym, co masz, możesz zobaczyć, że jedynym bajtem z najwyższym bitem (bajt, którego wartość wynosi ≥ 80 w systemie szesnastkowym) jest e6. To nie odpowiada prawidłowej sekwencji UTF-8 (w UTF-8 znaki inne niż ASCII wymagają co najmniej 2 bajtów z najwyższymi bitami). W ISO-8859-1 e6 to kodowanie znaku „æ”, który odpowiada oczekiwanemu tekstowi; potwierdza to, że w tym pliku zastosowano kodowanie ISO-8859-1 (lub podobne).
vinc17
5

Plik, który podłączyłeś, wygląda na UTF-8 w dokumencie HTML

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

Jeśli najpierw uruchomisz go za pomocą konwertera HTML-to-text, np

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

to fragment UTF-8, z którym masz problem, wydaje się transliterować bezbłędnie, tj

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

staje się

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

html2textNarzędzie nie może być zainstalowany w systemie - jeśli nie można zlokalizować / zainstalować go istnieją inne konwertery tym moduł Pythona.

steeldriver
źródło
Nie, plik nie jest zakodowany w UTF-8, ale w ISO-8859-1. BTW, filepolecenie mówi ASCII, ale powodem jest to, że patrzy tylko na początek pliku, a znak ISO-8859-1 pojawia się daleko, na pozycji 181536.
vinc17
@ vinc17 jak dowiedziałeś się, że plik znajduje się w ISO-8859?
user13107,
1
@ użytkownik13107, patrząc na kodowanie obrażającego znaku: jest to bajt „e6”, a nie sekwencja UTF-8 „c3 a6”. Emacs wykrył również, że plik jest w ISO-8859-1.
vinc17