2012-07-01 11 views
14

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

+1

'stampa obj' utilizzerà l'oggetto' __str__', non '__repr__'. – BrenBarn

+2

Qual è la tua codifica predefinita? Voglio dire * sys.getdefaultencoding() * –

+0

@BrenBarn: __str__ è implementato come return __repr __() – javex

risposta

4

ho finalmente risolto. Il problema era (non sono sicuro del perché) che se si chiamasse direttamente __str__() o __repr__() sarebbe meglio che lo gestisse correttamente, ma stampandolo direttamente (come in: print obj) non funziona (anche se dovrebbe solo chiamare lo __str__() stesso).

L'ultimo aiuto è venuto da questo article. Ho già raggiunto il punto in cui ho ottenuto di stampare sulla console (ma una lettera sbagliata) quando ho usato la codifica utf-8. Finalmente risolto che sia perfettamente corretto definendo questo:

def __str__(self): 
    return self.__repr__().encode(stdout.encoding) 

Ora l'unica questione aperta che rimane è: Perché print obj.__str__() e print obj diverso con questo? Non ha senso per me. E sì, per sottolinearlo ancora: chiamare il primo o __repr__() lavoro DID. E fa ancora con la codifica esplicita.

+0

L'articolo della guida non è più disponibile – Martlark

Problemi correlati