Pertanyaan Anda salah; kesalahan yang Anda lihat bukan hasil dari bagaimana Anda membangun python, tetapi dari kebingungan antara string byte dan string unicode.
String byte (misalnya "foo", atau 'bar', dalam sintaks python) adalah urutan oktet; angka dari 0-255. String Unicode (mis. U "foo" atau u'bar ') adalah urutan titik kode unicode; angka dari 0-1112064. Tetapi Anda tampaknya tertarik pada karakter é, yang (di terminal Anda) adalah urutan multi-byte yang mewakili satu karakter.
Alih-alih ord(u'é')
, coba ini:
>>> [ord(x) for x in u'é']
Itu memberitahu Anda urutan titik kode mana yang mewakili "é". Mungkin memberi Anda [233], atau mungkin memberi Anda [101, 770].
Alih-alih chr()
membalikkan ini, ada unichr()
:
>>> unichr(233)
u'\xe9'
Karakter ini sebenarnya dapat direpresentasikan sebagai satu atau beberapa "kode titik" unicode, yang dengan sendirinya mewakili grapheme atau karakter. Entah "e dengan aksen akut (yaitu, titik kode 233)", atau "e" (titik kode 101), diikuti oleh "aksen akut pada karakter sebelumnya" (titik kode 770). Jadi karakter yang sama persis ini dapat disajikan sebagai struktur data Python u'e\u0301'
atauu'\u00e9'
.
Sebagian besar waktu Anda tidak perlu peduli tentang ini, tetapi itu bisa menjadi masalah jika Anda mengulangi string unicode, karena iterasi bekerja dengan titik kode, bukan oleh karakter yang dapat diurai. Dengan kata lain, len(u'e\u0301') == 2
dan len(u'\u00e9') == 1
. Jika ini penting bagi Anda, Anda dapat mengonversi antara formulir yang dikomposisi dan diuraikan dengan menggunakan unicodedata.normalize
.
Unicode Glosarium dapat menjadi panduan bermanfaat untuk memahami beberapa masalah ini, dengan menunjukkan bagaimana masing-masing istilah spesifik merujuk pada bagian yang berbeda dari representasi teks, yang jauh lebih rumit daripada yang disadari oleh banyak programmer.