Sua pergunta está incorreta; o erro que você vê não é resultado de como você criou python, mas de uma confusão entre cadeias de bytes e cadeias unicode.
Cadeias de bytes (por exemplo, "foo", ou 'bar', na sintaxe python) são sequências de octetos; números de 0 a 255. Strings Unicode (por exemplo, u "foo" ou u'bar ') são sequências de pontos de código unicode; números de 0 a 11202064. Mas você parece estar interessado no caractere é, que (em seu terminal) é uma sequência de vários bytes que representa um único caractere.
Em vez de ord(u'é')
, tente o seguinte:
>>> [ord(x) for x in u'é']
Isso indica qual sequência de pontos de código "é" representa. Pode dar a você [233], ou pode dar a você [101, 770].
Em vez de chr()
reverter isso, existe unichr()
:
>>> unichr(233)
u'\xe9'
Na verdade, esse caractere pode ser representado como um ou vários "pontos de código" unicode, que representam grafos ou caracteres. É "e com um sotaque agudo (isto é, ponto de código 233)" ou "e" (ponto de código 101), seguido por "um sotaque agudo do caractere anterior" (ponto de código 770). Portanto, esse mesmo caractere exato pode ser apresentado como a estrutura de dados Python u'e\u0301'
ouu'\u00e9'
.
Na maioria das vezes, você não precisa se preocupar com isso, mas isso pode se tornar um problema se você estiver iterando sobre uma cadeia unicode, pois a iteração funciona por ponto de código, não por caractere decomponível. Em outras palavras, len(u'e\u0301') == 2
e len(u'\u00e9') == 1
. Se isso lhe interessa, você pode converter entre formulários compostos e decompostos usando unicodedata.normalize
.
O Glossário Unicode pode ser um guia útil para entender alguns desses problemas, apontando como cada termo específico se refere a uma parte diferente da representação do texto, o que é muito mais complicado do que muitos programadores imaginam.