UnicodeEncodeError: кодек ascii не может кодировать символ [...]

Я прочитал 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__()

Из документации я понял, что это

Ответы

Ответ 1

Я, наконец, решил. Проблема была (я не уверен, почему), что если вы вызывали либо __str__(), либо __repr__() напрямую, было бы hapyp обрабатывать его хорошо, но печать его напрямую (как в: print obj) не работает (хотя это должен просто вызвать только __str__()).

Последняя помощь появилась из этой статьи . Я уже получил тот шаг, на котором я получил его для печати на консоль (но неправильное письмо), когда я использовал кодировку utf-8. Наконец, решив, что это совершенно правильно, определите это:

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

Теперь остается единственный открытый вопрос: почему print obj.__str__() и print obj по-другому? Для меня это не имеет никакого смысла. И да, чтобы подчеркнуть это снова: вызов первой или __repr__() DID работы. И все же делает это с явным кодированием.