คำถามของคุณไม่ถูกต้อง ข้อผิดพลาดที่คุณเห็นไม่ใช่ผลมาจากวิธีที่คุณสร้างไพ ธ อน แต่เกิดความสับสนระหว่างสตริงไบต์และสตริงยูนิโค้ด
สตริงไบต์ (เช่น "foo" หรือ 'bar' ในรูปแบบ python) เป็นลำดับของ octets หมายเลข 0-255 สตริง Unicode (เช่น u "foo" หรือ u'bar ') เป็นลำดับของจุดโค้ดยูนิโค้ด หมายเลข 0-1112064 แต่ดูเหมือนว่าคุณจะสนใจอักขระéซึ่ง (ในเทอร์มินัลของคุณ) เป็นลำดับแบบหลายไบต์ที่แทนอักขระเดี่ยว
แทนที่จะord(u'é')
ลองทำสิ่งนี้:
>>> [ord(x) for x in u'é']
ที่บอกให้คุณทราบถึงลำดับของจุดรหัส "é" อาจให้ [233] หรืออาจมอบ [101, 770]
แทนที่จะchr()
ทำสิ่งนี้กลับมีunichr()
:
>>> unichr(233)
u'\xe9'
จริง ๆ แล้วตัวละครนี้อาจเป็นตัวแทน "จุดรหัส" ยูนิโค้ดเดียวหรือหลายซึ่งตัวเองเป็นตัวแทนของกราฟหรืออักขระ มันอาจเป็น "e ที่มีจุดเน้นเสียงแหลม (เช่นรหัสจุด 233)" หรือ "e" (จุดรหัส 101) ตามด้วย "เน้นเสียงแหลมบนตัวอักษรก่อนหน้า" (รหัสจุด 770) ดังนั้นลักษณะเดียวกันนี้ที่แน่นอนอาจจะนำเสนอเป็นโครงสร้างข้อมูลหลามหรือu'e\u0301'
u'\u00e9'
เวลาส่วนใหญ่ที่คุณไม่ควรกังวลเกี่ยวกับเรื่องนี้ แต่มันอาจกลายเป็นปัญหาถ้าคุณวนซ้ำสตริง unicode เนื่องจากการวนซ้ำทำงานโดยใช้จุดรหัสไม่ใช่ตัวแยกอักขระ ในคำอื่น ๆและlen(u'e\u0301') == 2
ถ้าเรื่องนี้กับคุณคุณสามารถแปลงระหว่างรูปแบบสงบและย่อยสลายโดยใช้len(u'\u00e9') == 1
unicodedata.normalize
อภิธานศัพท์ Unicodeอาจเป็นแนวทางที่เป็นประโยชน์ในการทำความเข้าใจปัญหาเหล่านี้โดยชี้ให้เห็นว่าแต่ละคำที่เจาะจงหมายถึงส่วนต่าง ๆ ของการแทนข้อความซึ่งมีความซับซ้อนกว่าโปรแกรมเมอร์จำนวนมาก