iconv séquence d'entrée illégale - pourquoi?

14

En essayant de convertir un fichier texte en son équivalent ASCII, j'obtiens un message d'erreur iconv: illegal input sequence at position.

La commande que j'utilise est iconv -f UTF-8 -t ascii//TRANSLIT file

Le caractère fautif est æ.

Le fichier texte lui-même est présent ici .

Pourquoi dit-on séquence illégale? Le caractère d'entrée est le bon caractère UTF-8 (U + 00E6).

user13107
la source

Réponses:

17

Le fichier est codé en ISO-8859-1, pas 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.....|

Et l'octet "e6" seul n'est pas une séquence UTF-8 valide.

Alors, utilisez iconv -f latin1 -t ascii//TRANSLIT file.

vinc17
la source
Comment savoir quel est l'octet correspondant au caractère incriminé? J'ai essayé la hexdump -C filecommande et j'ai obtenu 0002b220 72 75 69 6e e6 0a 20 2d 2d 20 48 6f 72 61 63 65 |ruin.. -- Horace|en sortie.
user13107
1
Dans ce que vous avez obtenu, vous pouvez voir que le seul octet du premier bit (un octet dont la valeur est ≥ 80 en hexadécimal) est e6. Cela ne correspond pas à une séquence UTF-8 valide (en UTF-8, les caractères non ASCII ont besoin d'au moins 2 octets de bit supérieur). Dans l'ISO-8859-1, e6 est le codage du caractère "æ", qui correspond au texte attendu; cela confirme donc que le codage ISO-8859-1 (ou similaire) est utilisé pour ce fichier.
vinc17
5

Le fichier que vous avez lié semble être UTF-8 dans un document HTML

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

Si vous l'exécutez d'abord via un convertisseur HTML-texte, par exemple

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

alors le fragment UTF-8 avec lequel vous semblez avoir des problèmes semble transliter sans erreur, c'est-à-dire

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

devient

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

L' html2textutilitaire peut ne pas être installé sur votre système - si vous ne pouvez pas le localiser / l'installer, il existe d'autres convertisseurs, y compris un module python.

tournevis
la source
Non, le fichier n'est pas encodé en UTF-8, mais en ISO-8859-1. BTW, la filecommande dit ASCII, mais la raison en est qu'elle ne regarde que le début du fichier et que le caractère ISO-8859-1 apparaît très loin, à la position 181536.
vinc17
@ vinc17 comment avez-vous découvert que le fichier était en ISO-8859?
user13107
1
@ user13107 en regardant l'encodage du caractère incriminé: c'est l'octet "e6", pas la séquence UTF-8 "c3 a6". Emacs a également détecté le fichier comme étant en ISO-8859-1.
vinc17