незаконна послідовність введення iconv - чому?


14

Під час спроби конвертувати текстовий файл у його еквівалент ASCII, я отримую повідомлення про помилку iconv: illegal input sequence at position.

Команда, якою я користуюся, є iconv -f UTF-8 -t ascii//TRANSLIT file

Образливий персонаж є æ.

Тут же присутній сам текстовий файл .

Чому це говорить незаконна послідовність? Символ введення є належним символом UTF-8 (U + 00E6).

Відповіді:


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.


Як дізнатись, який байт відповідає ображеному символу? Я спробував hexdump -C fileкоманду і отримав 0002b220 72 75 69 6e e6 0a 20 2d 2d 20 48 6f 72 61 63 65 |ruin.. -- Horace|як вихід.
користувач13107

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Утиліта не може бути встановлена на вашій системі - якщо ви не можете знайти / встановити його є й інші конвертери , включаючи модуль пітона.


Ні, файл кодується не в UTF-8, а в ISO-8859-1. BTW, fileкоманда говорить ASCII, але причина полягає в тому, що вона просто дивиться на початок файлу, а символ ISO-8859-1 з'являється далеко, у позиції 181536.
vinc17

@ vinc17 Як ти дізнався, що файл знаходився в ISO-8859?
користувач13107

1
@ user13107, дивлячись на кодування ображеного символу: це байт "e6", а не послідовність UTF-8 "c3 a6". Emacs також визначив, що файл знаходиться в ISO-8859-1.
vinc17
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.