Il parser SAX in Python 2.6 dovrebbe essere in grado di analizzare utf-8 senza mangling. Sebbene tu abbia omesso il ContentHandler che stai usando con il parser, se quel gestore di contenuti tenta di stampare qualsiasi carattere non-ascii sulla tua console, ciò causerà un arresto anomalo.
Per esempio, dire che ho questo documento XML:
<?xml version="1.0" encoding="utf-8"?>
<test>
<name>Champs-Élysées</name>
</test>
E questo apparato di analisi:
import xml.sax
class MyHandler(xml.sax.handler.ContentHandler):
def startElement(self, name, attrs):
print "StartElement: %s" % name
def endElement(self, name):
print "EndElement: %s" % name
def characters(self, ch):
#print "Characters: '%s'" % ch
pass
parser = xml.sax.make_parser()
parser.setContentHandler(MyHandler())
for line in open('text.xml', 'r'):
parser.feed(line)
Questo analizzerà bene, e il contenuto sarà infatti conservare i caratteri accentati della XML. L'unico problema è la riga in def characters()
che ho commentato. Eseguendo la console in Python 2.6, questo produrrà l'eccezione che stai vedendo perché la funzione di stampa deve convertire i caratteri in ascii per l'output.
Hai 3 possibili soluzioni:
Uno: Assicurarsi che il terminale supporta Unicode, quindi creare una voce sitecustomize.py
nel site-packages
e impostare il set di caratteri UTF-8:
import sys sys.setdefaultencoding ('utf-8')
Due: non stampare l'uscita al terminale (lingua-in-guancia)
Tre: Normalizzare l'output utilizzando unicodedata.normalize
per convertire caratteri non-ASCII in equivalenti ASCII, o encode
i caratteri in ASCII per l'uscita del testo: ch.encode('ascii', 'replace')
. Ovviamente, usando questo metodo non sarai in grado di valutare correttamente il testo.
Utilizzando l'opzione uno sopra, il codice ha funzionato bene per il mio in Python 2.5.
Questo ha funzionato in 2.5, anche. –