Анализатор SAX в Python 2.6 должен иметь возможность анализировать utf-8 без его искажений. Несмотря на то, что вы исключили ContentHandler, который вы используете с анализатором, если этот обработчик содержимого попытается вывести на консоль любые символы, не являющиеся ascii, это вызовет сбой.
Например, скажем, у меня есть этот документ XML:
<?xml version="1.0" encoding="utf-8"?>
<test>
<name>Champs-Élysées</name>
</test>
А это разбор аппарата:
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)
Это будет очень хорошо проанализировано, и содержимое действительно сохранит акцентированные символы в XML. Единственная проблема - это строка в def characters()
, которую я закомментировал. Работая в консоли в Python 2.6, вы получите исключение, которое вы видите, потому что функция печати должна преобразовывать символы в ascii для вывода.
У вас есть 3 возможных решения:
One : убедитесь, что ваш терминал поддерживает Unicode, затем создайте запись sitecustomize.py
в вашем site-packages
и установите для набора символов по умолчанию значение utf-8:
import sys
sys.setdefaultencoding ( 'UTF-8')
Два : Не печатать вывод на терминал (насмешливо)
Три : нормализовать вывод с помощью unicodedata.normalize
для преобразования не-ascii-символов в ascii-эквиваленты или encode
символов в ascii для вывода текста: ch.encode('ascii', 'replace')
. Конечно, используя этот метод, вы не сможете правильно оценить текст.
Используя первый вариант, ваш код работал хорошо для моего в Python 2.5.