คุณพบปัญหาทั่วไปเกี่ยวกับการเข้ารหัส: ฉันจะทราบได้อย่างไรว่าการเข้ารหัสไฟล์คืออะไร
คำตอบ: คุณไม่สามารถทำได้เว้นแต่รูปแบบไฟล์จะมีให้สำหรับสิ่งนี้ ตัวอย่างเช่น XML เริ่มต้นด้วย:
<?xml encoding="utf-8"?>
ส่วนหัวนี้ถูกเลือกอย่างระมัดระวังเพื่อให้สามารถอ่านได้ไม่ว่าจะเข้ารหัส ในกรณีของคุณไม่มีคำใบ้ดังกล่าวดังนั้นทั้งผู้แก้ไขและ Python ของคุณก็ไม่ทราบว่าเกิดอะไรขึ้น ดังนั้นคุณต้องใช้codecs
โมดูลและใช้codecs.open(path,mode,encoding)
ซึ่งให้บิตที่ขาดหายไปใน Python
สำหรับบรรณาธิการของคุณคุณต้องตรวจสอบว่ามันมีวิธีการตั้งค่าการเข้ารหัสไฟล์หรือไม่
จุดสำคัญของ UTF-8 คือสามารถเข้ารหัสอักขระ 21 บิต (Unicode) เป็นสตรีมข้อมูล 8 บิต (เพราะนั่นเป็นสิ่งเดียวที่คอมพิวเตอร์ทุกเครื่องในโลกสามารถจัดการได้) แต่เนื่องจากระบบปฏิบัติการส่วนใหญ่ลงวันที่ก่อน Unicode พวกเขาไม่ได้มีเครื่องมือที่เหมาะสมในการแนบข้อมูลการเข้ารหัสไปยังไฟล์บนฮาร์ดดิสก์
ปัญหาต่อไปคือการนำเสนอใน Python นี่คือคำอธิบายที่ดีเลิศในการแสดงความคิดเห็นโดย heikogerlach คุณต้องเข้าใจว่าคอนโซลของคุณสามารถแสดง ASCII ได้เท่านั้น ในการแสดง Unicode หรืออะไรก็ตาม> = charcode 128 จะต้องใช้วิธีการหลบหนี ในโปรแกรมแก้ไขของคุณคุณต้องไม่พิมพ์สตริงการแสดงผลที่หลบหนี แต่ความหมายของสตริง (ในกรณีนี้คุณต้องป้อนเครื่องหมาย umlaut และบันทึกไฟล์)
ที่กล่าวว่าคุณสามารถใช้ฟังก์ชัน Python eval () เพื่อเปลี่ยนสตริงที่ใช้ Escape เป็นสตริง:
>>> x = eval("'Capit\\xc3\\xa1n\\n'")
>>> x
'Capit\xc3\xa1n\n'
>>> x[5]
'\xc3'
>>> len(x[5])
1
อย่างที่คุณเห็นสตริง "\ xc3" กลายเป็นอักขระตัวเดียว นี่คือสตริง 8 บิตที่เข้ารหัส UTF-8 วิธีรับ Unicode:
>>> x.decode('utf-8')
u'Capit\xe1n\n'
Gregg Lindถาม: ฉันคิดว่ามีบางชิ้นหายไปที่นี่: ไฟล์ f2 ประกอบด้วย: hex:
0000000: 4361 7069 745c 7863 335c 7861 316e Capit\xc3\xa1n
codecs.open('f2','rb', 'utf-8')
ตัวอย่างเช่นอ่านพวกเขาทั้งหมดในตัวแยกที่แยกต่างหาก (คาดว่า) มีวิธีการเขียนไปยังไฟล์ใน ASCII ที่จะใช้งานได้หรือไม่?
คำตอบ: ขึ้นอยู่กับว่าคุณหมายถึงอะไร ASCII ไม่สามารถแสดงตัวอักษร> 127 ดังนั้นคุณต้องมีวิธีที่จะพูดว่า "ตัวละครไม่กี่ตัวต่อไปหมายถึงสิ่งที่พิเศษ" ซึ่งเป็นสิ่งที่ลำดับ "\ x" มันบอกว่า: ตัวละครสองตัวถัดไปเป็นรหัสของตัวละครเดียว "\ u" ทำเช่นเดียวกันโดยใช้อักขระสี่ตัวเพื่อเข้ารหัส Unicode สูงสุด 0xFFFF (65535)
ดังนั้นคุณไม่สามารถเขียน Unicode ไปยัง ASCII ได้โดยตรง (เนื่องจาก ASCII ไม่มีอักขระเดียวกัน) คุณสามารถเขียนมันเป็นสตริงหนี (เช่นใน f2); ในกรณีนี้ไฟล์สามารถแสดงเป็น ASCII หรือคุณสามารถเขียนเป็น UTF-8 ซึ่งในกรณีนี้คุณต้องมีสตรีมที่ปลอดภัย 8 บิต
วิธีการแก้ปัญหาของคุณโดยใช้decode('string-escape')
ทำงาน แต่คุณจะต้องตระหนักถึงหน่วยความจำเท่าใดคุณใช้: codecs.open()
สามเท่าของปริมาณการใช้
โปรดจำไว้ว่าไฟล์เป็นเพียงลำดับของไบต์ที่มี 8 บิต ทั้งบิตและไบต์ไม่มีความหมาย คุณคือคนที่บอกว่า "65 หมายถึง" A "" เนื่องจาก\xc3\xa1
ควรกลายเป็น "à" แต่คอมพิวเตอร์ไม่มีหนทางที่จะรู้คุณต้องบอกด้วยการระบุการเข้ารหัสที่ใช้เมื่อทำการเขียนไฟล์