Der SAX-Parser in Python 2.6 sollte in der Lage sein, utf-8 zu analysieren, ohne ihn zu verfälschen. Obwohl Sie den ContentHandler, den Sie mit dem Parser verwenden, weggelassen haben, führt dieser Content-Handler zu einem Absturz, wenn er versucht, nicht-ASCII-Zeichen auf Ihrer Konsole zu drucken.
Zum Beispiel, sagen, dass ich diese XML-doc:
<?xml version="1.0" encoding="utf-8"?>
<test>
<name>Champs-Élysées</name>
</test>
Und diese Parsing Apparat:
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)
Dies wird analysieren ganz gut, und der Inhalt werden die Zeichen mit Akzent in der Tat erhalten XML. Das einzige Problem ist die Zeile in def characters()
, die ich auskommentiert habe. In der Konsole in Python 2.6 ausgeführt, wird dies die Ausnahme erzeugen, die Sie sehen, da die Druckfunktion die Zeichen in ascii für die Ausgabe konvertieren muss.
Sie haben 3 mögliche Lösungen:
One: Stellen Sie sicher, dass Ihr Terminal Unicode unterstützt, dann erstellen Sie einen sitecustomize.py
Eintrag in Ihrem site-packages
und stellen Sie die Standardzeichen auf utf-8 gesetzt:
import sys sys.setdefaultencoding ('UTF-8')
Zwei: drucken Sie nicht die Ausgabe an das Endgerät (tongue-in-Wange)
Drei: Normalisieren des Ausgangs unicodedata.normalize
unter Verwendung von nicht-ASCII-Zeichen in ASCII-Äquivalente zu konvertieren oder encode
die Zeichen für die Textausgabe ASCII: ch.encode('ascii', 'replace')
. Mit dieser Methode können Sie den Text natürlich nicht richtig auswerten.
Mit Option eins oben, funktionierte Ihr Code für meine in Python 2.5.
Das funktionierte in 2.5 auch. –