เสมอเข้ารหัสจาก 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' เริ่มต้น†ซึ่งทำให้คุณมีข้อผิดพลาดในการถอดรหัสภายในตัวเข้ารหัสUnicodeDecodeErrorencodeunicodestrunicode
ในความเป็นจริงใน Python 3 มีวิธีการstr.decodeและbytes.encodeไม่มีอยู่จริง การลบออกเป็นความพยายาม [ขัดแย้ง] เพื่อหลีกเลี่ยงความสับสนนี้
† ... หรืออะไรก็ตามที่sys.getdefaultencoding()กล่าวถึงการเข้ารหัส; โดยปกติจะเป็น 'ascii'