Ваше запитання невірно; помилка, яку ви бачите, є не результатом того, як ви створили python, а плутаниною між байтовими рядками та рядками unicode.
Рядки байтів (наприклад, "foo" або "bar" у синтаксисі python) - це послідовності октетів; числа від 0-255. Рядки Unicode (наприклад, u "foo" або u'bar ') - це послідовності точок коду Unicode; числа від 0-1112064. Але вам здається, що вас цікавить символ é, який (у вашому терміналі) є багатобайтовою послідовністю, що представляє один символ.
Замість цього ord(u'é')
спробуйте:
>>> [ord(x) for x in u'é']
Це говорить про те, яку послідовність кодових точок "é" представляє. Він може дати вам [233], а може дати вам [101, 770].
Замість того, chr()
щоб скасувати це, є unichr()
:
>>> unichr(233)
u'\xe9'
Цей символ насправді може бути представлений або однією, або декількома "кодовими точками" унікоду, які самі по собі представляють або графеми, або символи. Це або "e з гострим наголосом (тобто, кодова точка 233)", або "e" (кодова точка 101), а потім "гострий наголос на попередньому символі" (код 770). Тож цей точно такий же символ може бути представлений як структура даних Python u'e\u0301'
абоu'\u00e9'
.
Більшу частину часу вам не доведеться дбати про це, але це може стати проблемою, якщо ви перебираєте рядок Unicode, оскільки ітерація працює за кодовою точкою, а не за символом, який можна розкласти. Іншими словами, len(u'e\u0301') == 2
і len(u'\u00e9') == 1
. Якщо це має значення для вас, ви можете конвертувати між складеними та розкладеними формами, використовуючи unicodedata.normalize
.
Глосарій Unicode може бути корисним посібником для розуміння деяких із цих питань, вказавши, як кожний конкретний термін відноситься до іншої частини подання тексту, що набагато складніше, ніж розуміють багато програмістів.