iconv trình tự nhập bất hợp pháp- tại sao?


13

Trong khi cố gắng chuyển đổi một tệp văn bản thành tương đương ASCII của nó, tôi nhận được thông báo lỗi đó iconv: illegal input sequence at position.

Lệnh tôi sử dụng là iconv -f UTF-8 -t ascii//TRANSLIT file

Các nhân vật vi phạm là æ.

Tập tin văn bản có mặt ở đây .

Tại sao nó nói trình tự bất hợp pháp? Ký tự đầu vào là ký tự UTF-8 thích hợp (U + 00E6).

Câu trả lời:


16

Tệp được mã hóa theo ISO-8859-1, không phải trong 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.....|

Và riêng byte "e6" không phải là chuỗi UTF-8 hợp lệ.

Vì vậy, sử dụng iconv -f latin1 -t ascii//TRANSLIT file.


Làm thế nào để tìm ra byte nào tương ứng với ký tự vi phạm? Tôi đã thử hexdump -C filelệnh và có 0002b220 72 75 69 6e e6 0a 20 2d 2d 20 48 6f 72 61 63 65 |ruin.. -- Horace|đầu ra.
dùng13107

1
Trong những gì bạn có, bạn có thể thấy rằng byte duy nhất được đặt trên cùng (một byte có giá trị là ≥ 80 theo hệ thập lục phân) là e6. Điều này không tương ứng với chuỗi UTF-8 hợp lệ (trong UTF-8, các ký tự không phải ASCII cần ít nhất 2 byte được đặt trên cùng bit). Trong ISO-8859-1, e6 là mã hóa ký tự "", tương ứng với văn bản dự kiến; vì vậy, điều này xác nhận rằng mã hóa ISO-8859-1 (hoặc tương tự) được sử dụng cho tệp này.
vinc17

5

Tệp bạn liên kết dường như là UTF-8 trong tài liệu HTML

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

Nếu trước tiên bạn chạy nó thông qua trình chuyển đổi HTML sang văn bản, vd

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

sau đó đoạn UTF-8 mà bạn dường như gặp sự cố xuất hiện để chuyển ngữ mà không có lỗi tức là

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

trở thành

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

Các html2texttiện ích có thể không được cài đặt trên hệ thống của bạn - nếu bạn không thể xác định vị trí / cài đặt nó có bộ chuyển đổi khác bao gồm một mô-đun python.


Không, tệp không được mã hóa theo UTF-8, nhưng ở ISO-8859-1. BTW, filelệnh nói ASCII, nhưng lý do là nó chỉ nhìn vào phần đầu của tệp và ký tự ISO-8859-1 xuất hiện ở xa, tại vị trí 181536.
vinc17

@ vinc17 làm thế nào bạn tìm ra tập tin trong ISO-8859?
dùng13107

1
@ user13107 bằng cách xem mã hóa của ký tự vi phạm: đó là byte "e6", không phải chuỗi UTF-8 "c3 a6". Emacs cũng phát hiện tệp như trong ISO-8859-1.
vinc17
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.