iconv Недопустимая последовательность ввода - почему?

14

При попытке преобразовать текстовый файл в его ASCII-эквивалент я получаю сообщение об ошибке iconv: illegal input sequence at position.

Я использую команду iconv -f UTF-8 -t ascii//TRANSLIT file

Оскорбительный персонаж есть æ.

Сам текстовый файл присутствует здесь .

Почему это говорит о недопустимой последовательности? Вводимый символ является правильным символом UTF-8 (U + 00E6).

user13107
источник

Ответы:

17

Файл закодирован в ISO-8859-1, а не в 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.....|

И один байт "e6" не является допустимой последовательностью UTF-8.

Итак, пользуйтесь iconv -f latin1 -t ascii//TRANSLIT file.

vinc17
источник
Как узнать, какой байт соответствует оскорбительному символу? Я попробовал hexdump -C fileкоманду и получил в 0002b220 72 75 69 6e e6 0a 20 2d 2d 20 48 6f 72 61 63 65 |ruin.. -- Horace|качестве вывода.
user13107
1
Из того, что вы получили, вы можете видеть, что единственный байт с верхним битом (байт со значением ≥80 в шестнадцатеричном формате) - это e6. Это не соответствует действительной последовательности UTF-8 (в UTF-8 не-ASCII-символам требуется как минимум 2 байта с набором верхних битов). В ISO-8859-1 e6 - кодировка символа «æ», которая соответствует ожидаемому тексту; таким образом, это подтверждает, что для этого файла используется кодировка ISO-8859-1 (или аналогичная).
vinc17
5

Файл, на который вы ссылаетесь, выглядит как UTF-8 внутри документа HTML

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

Если вы сначала запустите его через преобразователь HTML в текст, например,

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

затем фрагмент UTF-8, с которым у вас возникли проблемы, кажется, транслитерируется без ошибок, т.е.

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

становится

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

html2textУтилита не может быть установлена на вашей системе - если вы не можете найти / установить его есть и другие конвертеры , включая модуль питона.

steeldriver
источник
Нет, файл не кодируется в UTF-8, но в ISO-8859-1. Кстати, fileкоманда говорит ASCII, но причина в том, что она просто смотрит в начало файла, а символ ISO-8859-1 появляется далеко, в позиции 181536.
vinc17
@ vinc17 как ты узнал, что файл был в ISO-8859?
user13107
1
@ user13107, посмотрев на кодировку нарушающего символа: это байт "e6", а не последовательность UTF-8 "c3 a6". Emacs также обнаружил, что файл находится в ISO-8859-1.
vinc17