Votre question est incorrecte; l'erreur que vous voyez n'est pas le résultat de la façon dont vous avez construit python, mais d'une confusion entre les chaînes d'octets et les chaînes unicode.
Les chaînes d'octets (par exemple "foo", ou "bar", en syntaxe python) sont des séquences d'octets; nombres de 0 à 255. Les chaînes Unicode (par exemple u "foo" ou u'bar ') sont des séquences de points de code Unicode; numéros de 0-1112064. Mais vous semblez intéressé par le caractère é, qui (dans votre terminal) est une séquence multi-octets qui représente un seul caractère.
Au lieu de cela ord(u'é')
, essayez ceci:
>>> [ord(x) for x in u'é']
Cela vous indique quelle séquence de points de code "é" représente. Cela peut vous donner [233], ou cela peut vous donner [101, 770].
Au lieu d' chr()
inverser cela, il y aunichr()
:
>>> unichr(233)
u'\xe9'
Ce caractère peut en fait être représenté soit par un ou plusieurs "points de code" unicode, qui eux-mêmes représentent soit des graphèmes soit des caractères. Il s'agit soit de "e avec un accent aigu (c'est-à-dire, point de code 233)", soit de "e" (point de code 101), suivi de "un accent aigu sur le caractère précédent" (point de code 770). Donc, ce même caractère exact peut être présenté comme la structure de données Python u'e\u0301'
ou u'\u00e9'
.
La plupart du temps, vous ne devriez pas vous soucier de cela, mais cela peut devenir un problème si vous itérez sur une chaîne unicode, car l'itération fonctionne par point de code, et non par caractère décomposable. En d'autres termes, len(u'e\u0301') == 2
et len(u'\u00e9') == 1
. Si cela vous intéresse, vous pouvez convertir entre les formes composées et décomposées à l'aide de unicodedata.normalize
.
Le glossaire Unicode peut être un guide utile pour comprendre certains de ces problèmes, en montrant comment chaque terme spécifique fait référence à une partie différente de la représentation du texte, ce qui est beaucoup plus compliqué que ne le pensent de nombreux programmeurs.