iconv sequência de entrada ilegal - por que?


13

Ao tentar converter um arquivo de texto em seu equivalente ASCII, recebo uma mensagem de erro iconv: illegal input sequence at position.

O comando que eu uso é iconv -f UTF-8 -t ascii//TRANSLIT file

O personagem ofensivo é æ.

O próprio arquivo de texto está presente aqui .

Por que diz sequência ilegal? O caractere de entrada é o caractere UTF-8 adequado (U + 00E6).

Respostas:


16

O arquivo está codificado na ISO-8859-1, não na 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 o byte "e6" por si só não é uma sequência UTF-8 válida.

Então, use iconv -f latin1 -t ascii//TRANSLIT file.


Como descobrir qual é o byte correspondente ao caractere incorreto? Eu tentei hexdump -C filecomando e tenho 0002b220 72 75 69 6e e6 0a 20 2d 2d 20 48 6f 72 61 63 65 |ruin.. -- Horace|como saída.
user13107

1
No que você conseguiu, você pode ver que o único byte com limite de bits superior (um byte cujo valor é ≥ 80 em hexadecimal) é e6. Isso não corresponde a uma sequência UTF-8 válida (em UTF-8, caracteres não ASCII precisam de pelo menos 2 bytes com o conjunto de bits principais). Na ISO-8859-1, e6 é a codificação do caractere "æ", que corresponde ao texto esperado; portanto, isso confirma que a codificação ISO-8859-1 (ou similar) é usada para esse arquivo.
precisa saber é

5

O arquivo que você vinculou parece ser UTF-8 dentro de um documento HTML

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

Se você executá-lo através de um conversor de HTML para texto primeiro, por exemplo,

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

então o fragmento UTF-8 com o qual você parece estar tendo problemas parece transliterar sem erros, ou seja,

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

torna-se

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

O html2textutilitário pode não estar instalado no seu sistema - se você não conseguir localizar / instalar, existem outros conversores, incluindo um módulo python.


Não, o arquivo não está codificado em UTF-8, mas na ISO-8859-1. BTW, o filecomando diz ASCII, mas a razão é que ele só olha para o início do arquivo, eo caráter ISO-8859-1 parece muito longe, na posição 181536.
vinc17

@ vinc17 como você descobriu que o arquivo estava na ISO-8859?
precisa saber é o seguinte

1
@ user13107 observando a codificação do caractere incorreto: é o byte "e6", não a sequência UTF-8 "c3 a6". O Emacs também detectou o arquivo como ISO-8859-1.
precisa saber é
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.