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 работы. И все же делает это с явным кодированием.