iconv yasadışı giriş sırası- neden?


14

Bir metin dosyasını ASCII eşdeğerine dönüştürmeye çalışırken hata mesajı alıyorum iconv: illegal input sequence at position.

Kullandığım komut iconv -f UTF-8 -t ascii//TRANSLIT file

Rahatsız edici karakter æ.

Metin dosyasının kendisi burada mevcuttur .

Neden yasadışı dizilim diyor? Giriş karakteri uygun UTF-8 karakteridir (U + 00E6).

Yanıtlar:


17

Dosya, UTF-8'de değil, ISO-8859-1'de kodlanmıştır:

$ 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.....|

Ve sadece "e6" baytı geçerli bir UTF-8 dizisi değildir.

Yani, kullanın iconv -f latin1 -t ascii//TRANSLIT file.


Sorunlu karaktere karşılık gelen baytın hangisi olduğunu nasıl öğrenebilirim? hexdump -C fileKomuta denedim ve 0002b220 72 75 69 6e e6 0a 20 2d 2d 20 48 6f 72 61 63 65 |ruin.. -- Horace|çıktı aldım .
user13107

1
Elinizde, sadece üst bit kümesi baytının (değeri onaltılık olarak ≥ 80 olan bir bayt) e6 olduğunu görebilirsiniz. Bu geçerli bir UTF-8 dizisine karşılık gelmiyor (UTF-8'de, ASCII olmayan karakterler en az 2 üst bit set baytına ihtiyaç duyar). ISO-8859-1'de e6, beklenen metne karşılık gelen "æ" karakterinin kodlamasıdır; bu nedenle, bu dosya için ISO-8859-1 kodlamasının (veya benzeri) kullanıldığını onaylar.
vinc17

5

Bağladığınız dosya bir HTML belgesi içinde UTF-8 gibi görünüyor

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

Öncelikle HTML'den metne dönüştürücü aracılığıyla çalıştırırsanız, ör.

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

o zaman sorun yaşadığınız UTF-8 parçasının hatasız olarak transliterasyon yaptığı görülür.

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

olur

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

Yardımcı html2textprogram sisteminize yüklenmemiş olabilir - bulamaz / kuramazsanız, bir python modülü de dahil olmak üzere başka dönüştürücüler vardır.


Hayır, dosya UTF-8'de değil, ISO-8859-1'de kodlanmıştır. BTW, filekomut ASCII diyor, ancak nedeni sadece dosyanın başlangıcına bakıyor ve ISO-8859-1 karakteri 181536 konumunda çok uzakta görünüyor.
vinc17

@ vinc17 dosyanın ISO-8859'da olduğunu nasıl buldunuz?
user13107

1
@ user13107 rahatsız edici karakterin kodlamasına bakarak: UTF-8 dizisi "c3 a6" değil, "e6" baytıdır. Emacs ayrıca dosyayı ISO-8859-1'de olduğunu tespit etti.
vinc17
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.