La tua domanda non è corretta; l'errore che vedi non è il risultato di come hai creato Python, ma di una confusione tra stringhe di byte e stringhe unicode.
Le stringhe di byte (ad es. "Pippo", o "bar", nella sintassi di Python) sono sequenze di ottetti; numeri da 0 a 255. Le stringhe Unicode (ad es. U "foo" o u'bar ') sono sequenze di punti di codice unicode; numeri da 0-1112064. Ma sembra che tu sia interessato al carattere é, che (nel tuo terminale) è una sequenza multi-byte che rappresenta un singolo carattere.
Invece di ord(u'é')
, prova questo:
>>> [ord(x) for x in u'é']
Ciò indica quale sequenza di punti di codice "é" rappresenta. Potrebbe darti [233] o potrebbe darti [101, 770].
Invece di chr()
invertire questo, c'è unichr()
:
>>> unichr(233)
u'\xe9'
Questo personaggio può effettivamente essere rappresentato da un singolo o multiplo "punti di codice" unicode, che rappresentano essi stessi grafi o caratteri. È "e con un accento acuto (cioè il punto di codice 233)" o "e" (punto di codice 101), seguito da "un accento acuto sul carattere precedente" (punto di codice 770). Quindi questo stesso identico personaggio può essere presentato come la struttura dati di Python u'e\u0301'
o u'\u00e9'
.
Il più delle volte non dovresti preoccuparti di questo, ma può diventare un problema se stai iterando su una stringa unicode, poiché l'iterazione funziona per punto di codice, non per carattere scomponibile. In altre parole, len(u'e\u0301') == 2
e len(u'\u00e9') == 1
. Se questo è importante per te, puoi convertire tra forme composte e decomposte utilizzando unicodedata.normalize
.
Il Glossario Unicode può essere una guida utile per comprendere alcuni di questi problemi, indicando come ogni termine specifico si riferisce a una parte diversa della rappresentazione del testo, che è molto più complicata di quanto molti programmatori realizzino.