เสมอเข้ารหัสจาก Unicode ไบต์
ในทิศทางนี้คุณได้รับเลือกการเข้ารหัส
>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print _
你好
อีกวิธีหนึ่งคือการถอดรหัสจากไบต์เป็นยูนิโคด
ในทิศทางนี้คุณต้องรู้ว่าการเข้ารหัสคืออะไร
>>> bytes = '\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print bytes
你好
>>> bytes.decode('utf-8')
u'\u4f60\u597d'
>>> print _
你好
จุดนี้ไม่สามารถเน้นเพียงพอ หากคุณต้องการหลีกเลี่ยงการเล่น Unicode "whack-a-mole" สิ่งสำคัญคือต้องเข้าใจว่าเกิดอะไรขึ้นในระดับข้อมูล มีการอธิบายอีกวิธีหนึ่งดังนี้:
- อ็อบเจ็กต์ Unicode ถูกถอดรหัสแล้วคุณไม่ต้องการเรียก
decode
ใช้
- มีการเข้ารหัสออบเจ็กต์ bytestring แล้วคุณไม่ต้องการเรียก
encode
ใช้
ตอนนี้เมื่อเห็น.encode
สตริงไบต์ Python 2 จะพยายามแปลงเป็นข้อความ ( unicode
วัตถุ) โดยปริยายก่อน ในทำนองเดียวกันเมื่อเห็น.decode
สตริงยูนิโคด Python 2 จะพยายามแปลงเป็นไบต์ ( str
อ็อบเจกต์) โดยปริยาย
การแปลงโดยนัยเหล่านี้เป็นสาเหตุที่คุณจะได้รับเมื่อคุณโทรหา มันเป็นเพราะการเข้ารหัสมักจะยอมรับพารามิเตอร์ของประเภท; เมื่อได้รับพารามิเตอร์จะมีการถอดรหัสโดยนัยเป็นวัตถุประเภทก่อนที่จะเข้ารหัสใหม่ด้วยการเข้ารหัสอื่น การแปลงนี้เลือกตัวถอดรหัส 'ascii' เริ่มต้น†ซึ่งทำให้คุณมีข้อผิดพลาดในการถอดรหัสภายในตัวเข้ารหัสUnicode
Decode
Error
encode
unicode
str
unicode
ในความเป็นจริงใน Python 3 มีวิธีการstr.decode
และbytes.encode
ไม่มีอยู่จริง การลบออกเป็นความพยายาม [ขัดแย้ง] เพื่อหลีกเลี่ยงความสับสนนี้
† ... หรืออะไรก็ตามที่sys.getdefaultencoding()
กล่าวถึงการเข้ารหัส; โดยปกติจะเป็น 'ascii'