iconv sequenza di input illegale- perché?


14

Mentre provo a convertire un file di testo nel suo equivalente ASCII, ricevo questo messaggio di errore iconv: illegal input sequence at position.

Il comando che uso è iconv -f UTF-8 -t ascii//TRANSLIT file

Il personaggio offensivo è æ.

Il file di testo stesso è presente qui .

Perché dice sequenza illegale? Il carattere di input è il carattere UTF-8 corretto (U + 00E6).

Risposte:


17

Il file è codificato in ISO-8859-1, non 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.....|

E il byte "e6" da solo non è una sequenza UTF-8 valida.

Quindi usa iconv -f latin1 -t ascii//TRANSLIT file.


Come scoprire quale è il byte corrispondente al carattere offensivo? Ho provato il hexdump -C filecomando e ottenuto 0002b220 72 75 69 6e e6 0a 20 2d 2d 20 48 6f 72 61 63 65 |ruin.. -- Horace|come output.
user13107

1
In quello che hai, puoi vedere che l'unico byte top-bit-set (un byte il cui valore è ≥ 80 in esadecimale) è e6. Ciò non corrisponde a una sequenza UTF-8 valida (in UTF-8, i caratteri non ASCII necessitano di almeno 2 byte top-bit impostati). In ISO-8859-1, e6 è la codifica del carattere "æ", che corrisponde al testo previsto; quindi, ciò conferma che la codifica ISO-8859-1 (o simile) viene utilizzata per questo file.
vinc17,

5

Il file che hai collegato sembra essere UTF-8 all'interno di un documento HTML

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

Se lo esegui prima attraverso un convertitore da HTML a testo, ad es

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

quindi il frammento UTF-8 con il quale sembra avere problemi sembra traslitterare senza errori, ad es

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

diventa

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

L' html2textutilità potrebbe non essere installata sul tuo sistema - se non riesci a trovarla / installarla ci sono altri convertitori incluso un modulo Python.


No, il file non è codificato in UTF-8, ma in ISO-8859-1. A proposito, il filecomando dice ASCII, ma il motivo è che guarda solo all'inizio del file e il carattere ISO-8859-1 appare lontano, nella posizione 181536.
vinc17

@ vinc17 come hai scoperto che il file era in ISO-8859?
user13107

1
@utente13107 osservando la codifica del carattere offensivo: è il byte "e6", non la sequenza UTF-8 "c3 a6". Emacs ha inoltre rilevato che il file era in ISO-8859-1.
vinc17
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.