iconv urutan input ilegal- mengapa?


14

Ketika mencoba untuk mengkonversi file teks ke ASCII yang setara, saya mendapatkan pesan kesalahan itu iconv: illegal input sequence at position.

Perintah yang saya gunakan adalah iconv -f UTF-8 -t ascii//TRANSLIT file

Karakter yang menyinggung adalah æ.

File teks itu sendiri ada di sini .

Mengapa dikatakan urutan ilegal? Karakter input adalah karakter UTF-8 yang tepat (U + 00E6).

Jawaban:


17

File dikodekan dalam ISO-8859-1, bukan di 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.....|

Dan byte "e6" saja bukan urutan UTF-8 yang valid.

Jadi, gunakan iconv -f latin1 -t ascii//TRANSLIT file.


Bagaimana cara mengetahui byte yang sesuai dengan karakter yang menyinggung? Saya mencoba hexdump -C fileperintah dan mendapat 0002b220 72 75 69 6e e6 0a 20 2d 2d 20 48 6f 72 61 63 65 |ruin.. -- Horace|sebagai output.
user13107

1
Dalam apa yang Anda dapatkan, Anda dapat melihat bahwa satu-satunya byte bit-set-atas (byte yang nilainya ≥ 80 dalam heksadesimal) adalah e6. Ini tidak sesuai dengan urutan UTF-8 yang valid (dalam UTF-8, karakter non-ASCII membutuhkan setidaknya 2 byte bit set atas). Dalam ISO-8859-1, e6 adalah pengkodean karakter "æ", yang sesuai dengan teks yang diharapkan; jadi, ini menegaskan bahwa penyandian ISO-8859-1 (atau serupa) digunakan untuk file ini.
vinc17

5

File yang Anda tautkan tampaknya UTF-8 di dalam dokumen HTML

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

Jika Anda menjalankannya melalui konverter HTML-ke-teks terlebih dahulu, mis

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

maka fragmen UTF-8 Anda tampaknya mengalami masalah dengan tampaknya transliterasi tanpa kesalahan yaitu

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

menjadi

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

The html2textutilitas tidak dapat diinstal pada sistem Anda - jika Anda tidak dapat menemukan / menginstalnya ada konverter lain termasuk modul python.


Tidak, file tidak dikodekan dalam UTF-8, tetapi dalam ISO-8859-1. BTW, fileperintah itu mengatakan ASCII, tetapi alasannya adalah bahwa itu hanya terlihat di awal file, dan karakter ISO-8859-1 muncul jauh, di posisi 181536.
vinc17

@ vinc17 bagaimana Anda mengetahui file itu di ISO-8859?
user13107

1
@ user13107 dengan melihat pengkodean karakter yang menyinggung: itu adalah byte "e6", bukan urutan UTF-8 "c3 a6". Emacs juga mendeteksi file tersebut dalam ISO-8859-1.
vinc17
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.