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__() 

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

  • Панды и юникод
  • IDLE и символы Unicode (2.5.4)
  • Python __str__ против __unicode__
  • subprocess.Popen с помощью пути unicode
  • Пути файлов Python 3: os.walk () UnicodeEncodeError: кодек «utf-8» не может кодироваться: суррогаты не разрешены
  • strip () и strip (string.whitespace) дают разные результаты, несмотря на документацию, предполагающую, что они должны быть одинаковыми
  • Печать Юникода в консоли eclipse Pydev и в режиме ожидания
  • Чтение данных на русском языке из csv
  • 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 - лучший язык программирования в мире.