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