Ваше запитання невірно; помилка, яку ви бачите, є не результатом того, як ви створили 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 може бути корисним посібником для розуміння деяких із цих питань, вказавши, як кожний конкретний термін відноситься до іншої частини подання тексту, що набагато складніше, ніж розуміють багато програмістів.