Tu pregunta es incorrecta; el error que ves no es el resultado de cómo construiste python, sino de una confusión entre cadenas de bytes y cadenas unicode.
Las cadenas de bytes (por ejemplo, "foo", o 'bar', en sintaxis de python) son secuencias de octetos; números del 0-255. Las cadenas Unicode (por ejemplo, u "foo" o u'bar ') son secuencias de puntos de código unicode; números del 0-1112064. Pero parece estar interesado en el carácter é, que (en su terminal) es una secuencia de varios bytes que representa un solo carácter.
En lugar de ord(u'é')
, intente esto:
>>> [ord(x) for x in u'é']
Eso te dice qué secuencia de puntos de código representa "é". Puede darle [233], o puede darle [101, 770].
En lugar de chr()
revertir esto, hay unichr()
:
>>> unichr(233)
u'\xe9'
Este personaje puede representarse en realidad como "puntos de código" unicode simples o múltiples, que a su vez representan grafemas o caracteres. Es "e con un acento agudo (es decir, punto de código 233)" o "e" (punto de código 101), seguido de "un acento agudo en el carácter anterior" (punto de código 770). Por lo que este mismo carácter exacto puede ser presentada como la estructura de datos de Python u'e\u0301'
o u'\u00e9'
.
La mayoría de las veces no debería preocuparse por esto, pero puede convertirse en un problema si está iterando sobre una cadena Unicode, ya que la iteración funciona por punto de código, no por caracteres descomponibles. En otras palabras, len(u'e\u0301') == 2
y len(u'\u00e9') == 1
. Si esto es importante para usted, puede convertir entre formas compuestas y descompuestas utilizando unicodedata.normalize
.
El Glosario Unicode puede ser una guía útil para comprender algunos de estos problemas, al señalar cómo cada término específico se refiere a una parte diferente de la representación del texto, que es mucho más complicado de lo que muchos programadores se dan cuenta.