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

Я прочитал HOWTO в Unicode из официальных документов и полную, очень подробную статью . Тем не менее, я не понимаю, почему это порождает мне эту ошибку.

Вот что я пытаюсь: я открываю 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, но поскольку я не пишу символы Юникода непосредственно в нем, это не должно применяться здесь. То же самое для следующей строки: from __future__ import unicode_literals который также является правильным в начале.

Затем я xmldata.getElementsByTagName(tagName)[0].firstChild.data сгенерированный объект в свой класс, где я читаю теги в таких переменных: xmldata.getElementsByTagName(tagName)[0].firstChild.data и присваиваю его переменной в моем классе.

Теперь, что отлично работает, это команды (obj – это экземпляр класса):

 for element in obj: print element 

И эта команда тоже работает:

 print obj.__repr__() 

Я определил __iter__() чтобы просто __repr__() каждую переменную, в то время как __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__() 

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

One Solution collect form web for “UnicodeEncodeError: кодек ascii не может кодировать символ”

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

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

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

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

  • Python 2.7: чтение файла с китайскими иероглифами
  • Как я могу сбросить строку в Python 2?
  • Python JSON и Unicode
  • Акцентированные персонажи в Matplotlib
  • Нормализация Unicode
  • Некоторые основные вопросы Python
  • Отправить запрос POST не ASCII в Python?
  • Необработанный литерал unicode, который действителен в Python 2 и Python 3?
  •  
    Interesting Posts for Van-Lav

    Совместное использование большого массива с непрерывной записью только для чтения между процессами многопроцессорности

    Доступ к атрибуту функции, созданному в декораторе вне этого декоратора

    Получение имени переменной в виде строки

    Python CSV read-> write; удалить и заменить PLUS: конец строки – формат JSON

    Python: замена элемента в списке списков

    Должен ли я изучать Python после C ++?

    Google App Engine: как отправить html с помощью send_mail

    Как сделать очень простой HTTP-прокси, используя werkzeug или другую инфраструктуру запросов python?

    Python эквивалент вывода файла трубопровода на gzip в Perl, используя канал

    Эффективный способ заменить значение каждой ячейки в кадре данных pandas

    psycopg2 TypeError: не все аргументы, преобразованные во время форматирования строки

    python "Объект NoneType не имеет атрибута 'encode'"

    Pandas / Python: заменить несколько значений в нескольких столбцах

    Python: Невозможно запустить новый поток. <100 активных потоков

    Пирамида: Пользовательская страница 404 возвращается как «200 OK»

    Python - лучший язык программирования в мире.