Ваш вопрос неверный; ошибка, которую вы видите, является не результатом того, как вы создали 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'
Этот символ на самом деле может быть представлен как одной или несколькими «кодовыми точками» Юникода, которые сами представляют либо графемы, либо символы. Это либо «е с острым акцентом (т.е. кодовая точка 233)», либо «е» (кодовая точка 101), за которым следует «острый акцент на предыдущий символ» (кодовая точка 770). Так что этот точно такой же символ может быть представлен как структура данных Python u'e\u0301'
или u'\u00e9'
.
В большинстве случаев вам не нужно об этом заботиться, но это может стать проблемой, если вы выполняете итерацию по строке в юникоде, так как итерация работает по кодам, а не по разложимым символам. Другими словами, len(u'e\u0301') == 2
и len(u'\u00e9') == 1
. Если это имеет значение для вас, вы можете конвертировать между составными и разложенными формами, используя unicodedata.normalize
.
Глоссарий Unicode может быть полезным руководством для понимания некоторых из этих проблем, указывая, как каждый конкретный термин относится к разной части представления текста, что гораздо сложнее, чем у многих программистов реализовать.