Я прочитал HOWTO в Юникоде из официальных документов и полную, очень подробную статью , как Что ж. Тем не менее, я не понимаю, почему это порождает эту ошибку.
Вот что я пытаюсь: я открываю XML файл, содержащий символы из диапазона ASCII (но внутри допустимого диапазона XML). Я делаю это с cfg = codecs.open(filename, encoding='utf-8, mode='r')
, который работает нормально. Глядя на строку с помощью repr()
, также отображается строка юникода.
Теперь я продолжаю читать и читаю это с помощью parseString(cfg.read().encode('utf-8')
. Конечно, мой XML файл начинается с этого: <?xml version="1.0" encoding="utf-8"?>
. Хотя я предполагаю, что это не имеет значения, я также определил utf-8 для моего python script, но поскольку я не пишу символы Юникода непосредственно в нем, это не должно применяться здесь. То же самое для следующей строки: from __future__ import unicode_literals
, которая также находится в начале.
Далее я передаю сгенерированный объект в свой класс, где я читаю теги в таких переменных: xmldata.getElementsByTagName(tagName)[0].firstChild.data
и присваиваю его переменной в моем классе.
Теперь, что отлично работает, эти команды (obj - это экземпляр класса):
for element in obj:
print element
И эта команда также работает:
print obj.__repr__()
Я определил __iter__()
, чтобы просто вывести каждую переменную, а __repr__()
использует типичный материал printf: "%s" % self.varname
Обе команды отлично печатаются и могут выводить символ Юникода. Что не работает:
print obj
И теперь я застреваю, потому что это бросает страшный
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 47:
Так что мне не хватает? Что я делаю не так? Я ищу общее решение, я всегда хочу обрабатывать строки как unicode, чтобы избежать возможных ошибок и написать совместимую программу.
Изменить: я также определил это:
def __str__(self):
return self.__repr__()
def __unicode__(self):
return self.__repr__()
Из документации я понял, что это