ตามที่คนอื่น ๆ ได้กล่าว# coding:
ไว้ระบุการเข้ารหัสที่ไฟล์ต้นฉบับจะถูกบันทึกไว้นี่คือตัวอย่างบางส่วนเพื่อแสดงสิ่งนี้:
ไฟล์ที่บันทึกในดิสก์เป็น cp437 (การเข้ารหัสคอนโซลของฉัน) แต่ไม่มีการประกาศการเข้ารหัส
b = 'über'
u = u'über'
print b,repr(b)
print u,repr(u)
เอาท์พุท:
File "C:\ex.py", line 1
SyntaxError: Non-ASCII character '\x81' in file C:\ex.py on line 1, but no
encoding declared; see http://www.python.org/peps/pep-0263.html for details
ผลลัพธ์ของไฟล์ที่# coding: cp437
เพิ่ม:
über '\x81ber'
über u'\xfcber'
ในตอนแรก Python ไม่รู้จักการเข้ารหัสและบ่นเกี่ยวกับอักขระที่ไม่ใช่ ASCII เมื่อทราบการเข้ารหัสแล้วสตริงไบต์จะได้รับไบต์ที่อยู่บนดิสก์จริง สำหรับสตริง Unicode Python อ่าน \ x81 รู้ว่าใน cp437 นั่นคือüและถอดรหัสเป็น Unicode codepoint สำหรับüซึ่งเป็น U + 00FC เมื่อพิมพ์สตริงไบต์ Python จะส่งค่าฐานสิบหก81
ไปยังคอนโซลโดยตรง เมื่อสายอักขระ Unicode พิมพ์, Python อย่างถูกต้องตรวจพบการเข้ารหัสคอนโซลของฉันเป็น cp437 และแปล Unicode üกับค่า cp437 สำหรับü
นี่คือสิ่งที่เกิดขึ้นกับไฟล์ที่ประกาศและบันทึกใน UTF-8:
├╝ber '\xc3\xbcber'
über u'\xfcber'
ใน UTF-8 üถูกเข้ารหัสเป็นไบต์ฐานสิบหกC3 BC
ดังนั้นสตริงไบต์จึงมีไบต์เหล่านั้น แต่สตริง Unicode จะเหมือนกับตัวอย่างแรก Python อ่านสองไบต์และถอดรหัสอย่างถูกต้อง Python พิมพ์สตริงไบต์ไม่ถูกต้องเนื่องจากส่ง UTF-8 ไบต์สองไบต์ที่แสดงถึงüไปยังคอนโซล cp437 ของฉันโดยตรง
ที่นี่มีการประกาศไฟล์ cp437 แต่บันทึกใน UTF-8:
├╝ber '\xc3\xbcber'
├╝ber u'\u251c\u255dber'
สตริงไบต์ยังคงได้รับไบต์บนดิสก์ (UTF-8 hex bytes C3 BC
) แต่ตีความเป็นอักขระ cp437 สองตัวแทนที่จะเป็นอักขระเข้ารหัส UTF-8 ตัวเดียว อักขระสองตัวที่แปลเป็นรหัส Unicode ชี้และทุกอย่างพิมพ์ไม่ถูกต้อง
# coding: utf8
ดีพอไม่ต้อง-*-