ฉันจะดูการเข้ารหัสที่ใช้ในไฟล์ได้อย่างไร


23

ฉันมีปัญหากับไฟล์คำบรรยายในวิดีโอ omxplayer เพื่อแก้ปัญหาฉันต้องแปลงจากการเข้ารหัส windows-1250 เป็น UTF-8 คำถามของฉันคือฉันจะดูไฟล์เฉพาะบางไฟล์ที่ใช้การเข้ารหัสได้อย่างไร


piconvเพื่อเปลี่ยนการเข้ารหัส;)
Rinzwind

ใช่. ฉันเปลี่ยนการเข้ารหัสแล้ว (ใน 1 ไฟล์) แต่ฉันมีสิ่งเหล่านี้มากมายและต้องการสร้างบทเล็ก ๆ ที่จะควบคุมพวกเขาทั้งหมดแล้วซ่อนไว้ถ้าจำเป็น แต่ฉันคิดว่าฉันสามารถแปลงพวกมันทั้งหมดได้ จะไม่มีอันตรายใด ๆ หากมีบางอย่างใน UTF-8 อยู่แล้ว ขวา?
NonStandardModel

ไม่ใช่ปัญหาเลย :) เพียงแค่ใช้ไวด์การ์ด
Rinzwind

คำตอบ:


26

คุณไม่สามารถรู้ได้โดยอัตโนมัติว่าไฟล์นั้นเขียนด้วยการเข้ารหัส X แต่แรก

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

ปัญหาคือตัวแปลงสัญญาณจำนวนมากมีความคล้ายคลึงกันและมี "รูปแบบไบต์ที่ถูกต้อง" ที่เหมือนกันเพียงแค่ตีความพวกเขาเป็นตัวละครที่แตกต่างกัน ตัวอย่างเช่นการäเข้ารหัสแบบ in one อาจสอดคล้องกับการเข้ารหัสแบบéอื่นหรือøแบบที่สาม คอมพิวเตอร์ไม่สามารถตรวจจับได้ว่าวิธีใดที่จะแปลผลลัพธ์ไบต์เป็นข้อความที่มนุษย์อ่านได้อย่างถูกต้อง (เว้นแต่คุณจะเพิ่มพจนานุกรมสำหรับภาษาทุกประเภทและให้ทำการตรวจสอบการสะกดคำ ... ) คุณต้องรู้ด้วยว่าชุดอักขระบางตัวเป็นชุดย่อยของชุดอื่น ๆ เช่นการเข้ารหัส ASCII เป็นส่วนหนึ่งของตัวแปลงสัญญาณที่ใช้กันทั่วไปเช่น ANSI ตระกูลหรือ UTF-8 นั่นหมายความว่าตัวอย่างเช่นข้อความที่บันทึกเป็น UTF-8 ที่มีเฉพาะตัวอักษรละตินแบบง่ายมันจะเหมือนกับไฟล์เดียวกันที่บันทึกเป็น ASCII


อย่างไรก็ตามให้กลับมาอธิบายสิ่งที่คุณไม่สามารถทำได้กับสิ่งที่คุณทำได้จริง:

สำหรับการตรวจสอบพื้นฐานเกี่ยวกับไฟล์ข้อความ ASCII / non-ASCII (ปกติ UTF-8) คุณสามารถใช้fileคำสั่ง ไม่ทราบว่ามีตัวแปลงสัญญาณหลายตัวและตรวจสอบเพียงไม่กี่ kB แรกของไฟล์โดยสมมติว่าส่วนที่เหลือจะไม่มีอักขระใหม่ ในทางกลับกันมันยังรับรู้ประเภทไฟล์ทั่วไปอื่น ๆ เช่นสคริปต์ต่างๆเอกสาร HTML / XML และรูปแบบข้อมูลไบนารีจำนวนมาก (ซึ่งไม่น่าสนใจทั้งหมดสำหรับการเปรียบเทียบไฟล์ข้อความแม้ว่า) และอาจพิมพ์ข้อมูลเพิ่มเติมไม่ว่าจะมีเส้นยาวมากหรืออะไร ประเภทของลำดับบรรทัดใหม่ (เช่น UNIX: LF, Windows: CR + LF) ถูกนำมาใช้

$ cat ascii.txt 
I am an ASCII file.
Just text and numb3rs and simple punctuation...

$ cat utf8.txt 
I am a Unicode file.
Special characters like Ω€®Ŧ¥↑ıØÞöäüß¡!

$ file ascii.txt utf8.txt 
ascii.txt: ASCII text
utf8.txt:  UTF-8 Unicode text

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


ANSI ไม่ใช่ชื่อของการเข้ารหัสอักขระใด ๆ บางทีคุณอาจกำลังคิดรหัสหลบหนี ANSI ซึ่งสามารถแสดงด้วยการเข้ารหัสอักขระ ASCII
kasperd

@kasperd เป็นไปได้มากที่เขาอ้างถึงหนึ่งในตระกูลหน้า ISO 8859 หรือรหัสหน้าต่าง สำหรับนักพัฒนา windows ในอเมริกาเหนือการเข้ารหัส ANSI มักหมายถึงการเข้ารหัส Windows 1252 ด้วยเหตุผลทางประวัติศาสตร์
user1937198

ใช่แล้ว ANSI นั้นโดยพื้นฐานแล้วคือ ASCII (รหัส 0-127) บวกกับเพจรหัสเฉพาะตำแหน่งที่ตั้ง (รหัส 128-255) ดังนั้นคุณพูดถูก ...
ผู้บัญชาการ Byte

ข้อมูลเพิ่มเติม: รูปแบบ ANSI คืออะไร
wjandrea

12

โปรแกรมที่มีชื่อfileสามารถทำได้ ตัวอย่าง:

$ echo aaa >> FILE
$ file FILE
FILE: ASCII text, with CRLF, LF line terminators
$ echo öäü >> FILE
$ file FILE
FILE: UTF-8 Unicode text, with CRLF, LF line terminators

src/encoding.cหากคุณกำลังสนใจในวิธีการที่จะมาดูกันทำ


2
มันสามารถเดาได้
ฮอบส์

2
fileคาดเดาและบ่อยครั้งที่มันไม่ได้ดีมาก ตัวอย่างเช่นในการทดสอบของฉันมันระบุว่า MacRoman และ CP-1252 ผิดพลาดเป็น ISO-8859 โดยมีผลลัพธ์ว่า "š" และ "ß" มีสัญญาณรบกวน
ทำเครื่องหมาย

เยี่ยมมาก! ใช้เวลาหลายชั่วโมงเพื่อค้นหาการเข้ารหัส.sqlไฟล์เก่าที่ถูกต้องและfileแสดงให้ฉันเห็นว่ามันเป็นgzipไฟล์บีบอัดจริง ๆ!
Amirreza Nasiri
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.