จะตรวจจับการเข้ารหัสไฟล์ได้อย่างไร?


115

ในระบบไฟล์ของฉัน (Windows 7) ฉันมีไฟล์ข้อความบางไฟล์ (นี่คือไฟล์สคริปต์ SQL หากมีความสำคัญ)

เมื่อเปิดด้วยNotepad ++ในเมนู "การเข้ารหัส" บางรายการถูกรายงานว่ามีการเข้ารหัส "UCS-2 Little Endian" และ "UTF-8 ที่ไม่มี BOM" บางส่วน

ความแตกต่างที่นี่คืออะไร? พวกเขาทั้งหมดดูเหมือนจะเป็นสคริปต์ที่สมบูรณ์แบบ ฉันจะบอกได้อย่างไรว่าการเข้ารหัสไฟล์นั้นไม่มีแผ่นจดบันทึก ++


7
มีวิธีที่ง่ายมากในการใช้ Firefox เปิดไฟล์ของคุณโดยใช้ Firefox จากนั้นดู> การเข้ารหัสอักขระ รายละเอียดที่นี่
Catherine Gasnier

ใช้การวิเคราะห์พฤติกรรม ชำระเงินencaและchardetสำหรับระบบ POSIX
Janus Troelsen

3
ฉันคิดว่าคำตอบอื่นคือการทดลองและข้อผิดพลาด iconvโดยเฉพาะอย่างยิ่งมีประโยชน์สำหรับวัตถุประสงค์นี้ โดยพื้นฐานแล้วคุณวนซ้ำสตริงอักขระ / ข้อความที่เสียหายผ่านการเข้ารหัสที่แตกต่างกันเพื่อดูว่าอันไหนใช้ได้ คุณชนะเมื่อตัวละครไม่เสียหายอีกต่อไป ฉันชอบที่จะตอบที่นี่ด้วยตัวอย่างการเขียนโปรแกรม แต่มันเป็นคำถามที่ได้รับการป้องกัน
Brandon Bertelsen

FF คือการใช้เครื่องตรวจจับ Mozilla รหัสตัวอักษร อีกวิธีที่ง่ายคือการเปิดไฟล์ด้วยคำ MS มันจะเดาไฟล์ได้ค่อนข้างถูกต้องแม้แต่กับเพจรหัสภาษาจีนและญี่ปุ่นโบราณ
phuclv

หากchardetหรือchardetectไม่มีอยู่ในระบบของคุณคุณสามารถติดตั้งแพ็กเกจผ่านตัวจัดการแพ็กเกจของคุณ (เช่นapt search chardet- บน Ubuntu / เดเบียนแพคเกจมักจะเรียกว่าpython-chardetหรือpython3-chardet) หรือผ่านpipด้วยpip install chardet(หรือpip install cchardetสำหรับรุ่น c-optimization ที่เร็วขึ้น)
ccpizza

คำตอบ:


97

ไฟล์โดยทั่วไประบุการเข้ารหัสด้วยส่วนหัวของไฟล์ มีตัวอย่างจำนวนมากที่นี่ อย่างไรก็ตามแม้จะอ่านส่วนหัวคุณก็ไม่สามารถมั่นใจได้ว่าการเข้ารหัสไฟล์ใดที่ใช้งานอยู่

ตัวอย่างเช่นไฟล์ที่มีสามไบต์แรก0xEF,0xBB,0xBFคืออาจจะเป็นไฟล์เข้ารหัส UTF-8 แต่ก็อาจจะเป็นไฟล์ ISO-8859-1 ที่เกิดขึ้นจะเริ่มต้นด้วยตัวอักษร หรืออาจเป็นไฟล์ประเภทอื่นทั้งหมด

Notepad ++ ทำดีที่สุดในการคาดเดาว่ามีการเข้ารหัสไฟล์อะไรอยู่และส่วนใหญ่แล้วมันจะทำให้ถูกต้อง บางครั้งมันผิดพลาด - นั่นคือสาเหตุที่เมนู 'การเข้ารหัส' อยู่ที่นั่นเพื่อให้คุณสามารถแทนที่การเดาที่ดีที่สุด

สำหรับการเข้ารหัสสองข้อที่คุณพูดถึง:

  • ไฟล์ "UCS-2 Little Endian" เป็นไฟล์ UTF-16 (ขึ้นอยู่กับสิ่งที่ฉันเข้าใจจากข้อมูลที่นี่ ) ดังนั้นอาจเริ่มด้วย0xFF,0xFE2 ไบต์แรก จากสิ่งที่ฉันสามารถบอกได้ Notepad ++ อธิบายว่าเป็น "UCS-2" เนื่องจากไม่รองรับ UTF-16 บางแง่มุม
  • ไฟล์ "UTF-8 ที่ไม่มี BOM" ไม่มีส่วนหัวของไบต์ใด ๆ นั่นคือความหมายของบิต "ไม่มี BOM"


2
เหตุใดไฟล์ที่เริ่มต้นด้วย BOM จะถูกตรวจพบโดยอัตโนมัติในฐานะ "UTF-8 ไม่มี BOM"
Michael Borgwardt

2
และหากไฟล์เริ่มต้นด้วย 0xFF, 0xFE ควรตรวจพบอัตโนมัติในรูปแบบ UTF-16 ไม่ใช่ UCS-2 อาจจะเดาได้ว่า UCS-2 เพราะมันมีตัวอักษร ASCII เป็นส่วนใหญ่ดังนั้นทุก ๆ ไบต์จึงเป็นโมฆะ
Michael Borgwardt

2
ด้วยประสบการณ์อนิจจาเมทาดาทา (“ ส่วนหัว”) อาจผิดได้เช่นกัน ฐานข้อมูลที่เก็บข้อมูลอาจเสียหายหรือผู้อัปโหลดดั้งเดิมอาจผิดพลาด (นี่เป็นปัญหาที่สำคัญสำหรับเราในช่วงไม่กี่เดือนที่ผ่านมาข้อมูลบางส่วนถูกอัปโหลดเป็น "UTF-8" ยกเว้นว่าเป็น "ISO8859-1 จริงๆเพราะพวกเขาเหมือนกันจริงหรือ!" Bah! นักวิทยาศาสตร์ควรเก็บไว้ ห่างจากต้นกำเนิดของ metadata พวกเขาเพิ่งเข้าใจผิด…)
Donal Fellows

1
ที่จริงฉันคิดว่ามัน "ตลก" ที่ปัญหาการเข้ารหัสยังคงอยู่ในปี 2014 เนื่องจากไม่มีไฟล์ในโลกที่จะเริ่มต้นด้วย "" และฉันประหลาดใจมากเมื่อฉันเห็นหน้า HTML ซึ่งเต็มไปด้วยการเข้ารหัสที่ไม่ถูกต้อง มันเป็นเรื่องของความน่าจะเป็น มันคิดไม่ถึงว่าจะเลือกการเข้ารหัสที่ผิดถ้าการเข้ารหัสอื่นจะหลีกเลี่ยงตัวอักษรแปลก ๆ .. กำลังมองหาการเข้ารหัสที่หลีกเลี่ยงตัวอักษรแปลก ๆ ที่จะทำงานใน 99,9999% ของกรณีที่ฉันเดา แต่ก็ยังมีข้อผิดพลาด .. นอกจากนี้ยังเป็นข้อความที่สับสนมากที่จะใช้ ascii แทน UTF8 เพื่อประหยัดพื้นที่ .. มันทำให้นักพัฒนารุ่นใหม่สับสนในการทำ ..
Revious

18

คุณไม่สามารถ. หากคุณสามารถทำเช่นนั้นได้จะไม่มีเว็บไซต์หรือไฟล์ข้อความจำนวนมากที่มี“ การพูดพล่อยๆแบบสุ่ม” ออกไปที่นั่น นั่นเป็นสาเหตุที่การเข้ารหัสมักจะถูกส่งไปพร้อมกับเพย์โหลดเป็นข้อมูลเมตา

ในกรณีที่ไม่เป็นเช่นนั้นสิ่งที่คุณทำได้ก็คือ“ การคาดเดาอย่างฉลาด” แต่ผลลัพธ์มักจะคลุมเครือเนื่องจากลำดับไบต์เดียวกันอาจใช้ได้ในการเข้ารหัสหลายครั้ง


2
ตกลงแล้ว Windows OS จะเก็บข้อมูลนั้น (ข้อมูลเมตา) จริงหรือไม่? ในรีจิสทรีอาจ?
Marcel

คุณผิด. นั่นคือโค้ดเพจ - ไม่เหมือนกัน มีขั้นตอนวิธีการเดาการเข้ารหัส Unicode
DeadMG

6
@Marcel: ไม่นั่นเป็นเหตุผลที่ "ไฟล์ข้อความ" เป็นปัญหาสำหรับทุกอย่างยกเว้น ASCII บริสุทธิ์
Michael Borgwardt

ดี notepad ++ สามารถทำสิ่งนี้ได้มันสามารถบอกคุณได้ว่าไฟล์ข้อความนั้นถูกเข้ารหัส utf-8 หรือไม่
25
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.