Ho letto il HOWTO on Unicode dai documenti ufficiali e uno completo, molto dettagliato article pure. Ancora non capisco perché mi getta questo errore.UnicodeEncodeError: codec 'ascii' non può codificare il carattere [...]
Ecco ciò che cerco: apro un file XML che contiene caratteri di intervallo ASCII (ma all'interno dell'intervallo XML consentito). Lo faccio con cfg = codecs.open(filename, encoding='utf-8, mode='r')
che funziona bene. Guardare la stringa con repr()
mi mostra anche una stringa unicode.
Ora vado avanti e lo leggo con parseString(cfg.read().encode('utf-8')
. Naturalmente, il mio file XML inizia con questo: <?xml version="1.0" encoding="utf-8"?>
. Anche se suppongo che non sia rilevante, ho anche definito utf-8 per il mio script python, ma dal momento che non sto scrivendo caratteri unicode direttamente in esso, questo non dovrebbe applicarsi qui. Lo stesso vale per la riga seguente: from __future__ import unicode_literals
che è anche all'inizio.
Quindi passo l'oggetto generato alla mia classe in cui leggo i tag in variabili come questa: xmldata.getElementsByTagName(tagName)[0].firstChild.data
e lo assegno a una variabile nella mia classe.
ora che cosa perfettamente opere sono quei comandi (obj è un'istanza della classe):
for element in obj:
print element
E questo comando non funziona così:
print obj.__repr__()
ho definito __iter__()
a cedere solo ogni variabile mentre __repr__()
utilizza il tipico materiale di stampa: "%s" % self.varname
Entrambi i comandi vengono stampati perfettamente e possono essere emessi t lui carattere unicode. Che cosa non funziona è questo:
print obj
E ora mi sono bloccato perché questo getta il temuto
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 47:
Allora, cosa mi manca? Che cosa sto facendo di sbagliato? Sto cercando una soluzione generale, voglio sempre gestire le stringhe come unicode, solo per evitare eventuali errori e scrivere un programma compatibile.
Edit: ho anche definito questo:
def __str__(self):
return self.__repr__()
def __unicode__(self):
return self.__repr__()
Da documentazione che ho ottenuto che questa
'stampa obj' utilizzerà l'oggetto' __str__', non '__repr__'. – BrenBarn
Qual è la tua codifica predefinita? Voglio dire * sys.getdefaultencoding() * –
@BrenBarn: __str__ è implementato come return __repr __() – javex