Votre question est erronée; l'erreur que vous voyez n'est pas un résultat de la façon dont vous avez construit python, mais d'une confusion entre les chaînes d'octets et des chaînes unicode.
Chaînes d'octets (par exemple "toto", ou "bar", dans la syntaxe de python) sont des séquences d'octets; les nombres de 0 à 255. Des chaînes Unicode (par exemple, u"foo" ou u'bar') sont des séquences de points de code unicode; les numéros de 0-1112064. Mais vous avez l'air d'être intéressé par le caractère "é", qui (dans le terminal) est un multi-séquence d'octets qui représente un seul caractère.
Au lieu de ord(u'é')
, essayez ceci:
>>> [ord(x) for x in u'é']
Que vous indique la séquence de points de code "é" représente. Il peut vous donner [233], ou il peut vous donner [101, 770].
Au lieu de chr()
à inverser cette situation, il est unichr()
:
>>> unichr(233)
u'\xe9'
Ce caractère peut effectivement être représentée, que ce soit un seul ou plusieurs unicode "points de code", qui eux-mêmes représentent des graphèmes ou de caractères. C'est soit "e avec un accent aigu (c'est à dire, le point de code 233)", ou "e" (point de code 101), suivi par "un accent aigu sur le caractère précédent" (point de code 770). Donc, ce même personnage peut être présenté comme le Python structure de données u'e\u0301'
ou u'\u00e9'
.
La plupart du temps, vous ne devriez pas avoir à s'en préoccuper, mais il peut devenir un problème si vous êtes une itération sur une chaîne unicode, comme l'itération des œuvres de point de code, pas décomposable par caractère. En d'autres termes, len(u'e\u0301') == 2
et len(u'\u00e9') == 1
. Si cela vous intéresse, vous pouvez convertir entre les compose et décompose les formes en utilisant unicodedata.normalize
.
Le Glossaire Unicode peut être un guide utile à la compréhension de certaines de ces questions, en montrant comment chaque terme se réfère à une partie différente de la représentation d'un texte, qui est bien plus compliqué que de nombreux programmeurs de réaliser.