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|เป็นผลลัพธ์
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ยูทิลิตี้อาจไม่ได้รับการติดตั้งในระบบของคุณ - ถ้าคุณไม่สามารถหา / ติดตั้งมีแปลงอื่น ๆ รวมทั้งโมดูลหลาม


ไม่ไฟล์ไม่ได้เข้ารหัสใน UTF-8 แต่เป็น ISO-8859-1 BTW fileคำสั่งบอกว่า ASCII แต่เหตุผลก็คือดูที่จุดเริ่มต้นของไฟล์และตัวอักษร ISO-8859-1 จะปรากฏขึ้นที่ตำแหน่ง 181536
vinc17

@ vinc17 คุณทราบได้อย่างไรว่าไฟล์อยู่ใน ISO-8859
user13107

1
@ user13107 โดยดูที่การเข้ารหัสอักขระที่ละเมิด: เป็นไบต์ "e6" ไม่ใช่ลำดับ UTF-8 "c3 a6" Emacs ตรวจพบไฟล์ว่าอยู่ใน ISO-8859-1
vinc17
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.