Secuencia de entrada ilegal iconv: ¿por qué?

14

Al intentar convertir un archivo de texto en su equivalente ASCII, recibo un mensaje de error iconv: illegal input sequence at position.

El comando que uso es iconv -f UTF-8 -t ascii//TRANSLIT file

El personaje ofensivo es æ.

El archivo de texto en sí está presente aquí .

¿Por qué dice secuencia ilegal? El carácter de entrada es el carácter UTF-8 apropiado (U + 00E6).

usuario13107
fuente

Respuestas:

17

El archivo está codificado en ISO-8859-1, no en 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.....|

Y el byte "e6" por sí solo no es una secuencia UTF-8 válida.

Entonces, use iconv -f latin1 -t ascii//TRANSLIT file.

vinc17
fuente
¿Cómo averiguar cuál es el byte correspondiente al personaje infractor? Intenté el hexdump -C filecomando y obtuve 0002b220 72 75 69 6e e6 0a 20 2d 2d 20 48 6f 72 61 63 65 |ruin.. -- Horace|como salida.
user13107
1
En lo que obtuvo, puede ver que el único byte de conjunto de bits superior (un byte cuyo valor es ≥ 80 en hexadecimal) es e6. Esto no corresponde a una secuencia UTF-8 válida (en UTF-8, los caracteres no ASCII necesitan al menos 2 bytes de conjunto de bits superiores). En ISO-8859-1, e6 es la codificación del carácter "æ", que corresponde al texto esperado; entonces, esto confirma que la codificación ISO-8859-1 (o similar) se usa para este archivo.
vinc17
5

El archivo que vinculó parece ser UTF-8 dentro de un documento HTML

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

Si primero lo ejecuta a través de un convertidor de HTML a texto, p. Ej.

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

entonces el fragmento UTF-8 con el que parece tener problemas parece transliterar sin error, es decir

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

se convierte

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

Es html2textposible que la utilidad no esté instalada en su sistema; si no puede ubicarla / instalarla, hay otros convertidores, incluido un módulo de Python.

conductor de acero
fuente
No, el archivo no está codificado en UTF-8, sino en ISO-8859-1. Por cierto, el filecomando dice ASCII, pero la razón es que solo mira el comienzo del archivo, y el carácter ISO-8859-1 aparece muy lejos, en la posición 181536.
vinc17
@ vinc17 ¿cómo descubrió que el archivo estaba en ISO-8859?
user13107
1
@ user13107 mirando la codificación del carácter ofensivo: es el byte "e6", no la secuencia UTF-8 "c3 a6". Emacs también detectó que el archivo estaba en ISO-8859-1.
vinc17