UnicodeEncodeError: кодек 'ascii' не может закодировать символ u '\ xef' в позиции 0: порядковый номер не в диапазоне (128) - PullRequest
73 голосов
/ 28 февраля 2011

Я хочу проанализировать мой XML-документ.Поэтому я сохранил свой XML-документ, как показано ниже

class XMLdocs(db.Expando):  
   id = db.IntegerProperty()    
   name=db.StringProperty()  
   content=db.BlobProperty()  

Теперь мой код ниже - мой код

parser = make_parser()     
curHandler = BasketBallHandler()  
parser.setContentHandler(curHandler)  
for q in XMLdocs.all():  
        parser.parse(StringIO.StringIO(q.content))

Я получаю ошибку ниже

'ascii' codec can't encode character u'\xef' in position 0: ordinal not in range(128)
Traceback (most recent call last):  
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 517, in __call__
    handler.post(*groups)   
  File "/base/data/home/apps/parsepython/1.348669006354245654/mapreduce/base_handler.py", line 59, in post
    self.handle()   
  File "/base/data/home/apps/parsepython/1.348669006354245654/mapreduce/handlers.py", line 168, in handle
    scan_aborted = not self.process_entity(entity, ctx)   
  File "/base/data/home/apps/parsepython/1.348669006354245654/mapreduce/handlers.py", line 233, in process_entity
    handler(entity)   
  File "/base/data/home/apps/parsepython/1.348669006354245654/parseXML.py", line 71, in process
    parser.parse(StringIO.StringIO(q.content))   
  File "/base/python_runtime/python_dist/lib/python2.5/xml/sax/expatreader.py", line 107, in parse
    xmlreader.IncrementalParser.parse(self, source)   
  File "/base/python_runtime/python_dist/lib/python2.5/xml/sax/xmlreader.py", line 123, in parse
    self.feed(buffer)  
  File "/base/python_runtime/python_dist/lib/python2.5/xml/sax/expatreader.py", line 207, in feed
    self._parser.Parse(data, isFinal)   
  File "/base/data/home/apps/parsepython/1.348669006354245654/parseXML.py", line 136, in characters   
    print ch   
UnicodeEncodeError: 'ascii' codec can't encode character u'\xef' in position 0: ordinal not in range(128)   

Ответы [ 7 ]

112 голосов
/ 28 февраля 2011

Фактический лучший ответ для этой проблемы зависит от вашей среды, в частности, от того, что ожидает кодировка вашего терминала.

Самое быстрое решение в одну строку - закодировать все, что вы печатаете, в ASCII, который ваш терминал почти наверняка примет, и отбрасывать символы, которые вы не можете напечатать:

print ch #fails
print ch.encode('ascii', 'ignore')

Лучшее решениеизменить код вашего терминала на utf-8 и закодировать все как utf-8 перед печатью.Вы должны привыкнуть думать о кодировке Unicode КАЖДЫЙ раз, когда вы печатаете или читаете строку.

56 голосов
/ 16 августа 2013

Просто поставив .encode('utf-8') в конце объекта, можно выполнить работу в последних версиях Python.

30 голосов
/ 18 октября 2011

Это сработало для меня:

from django.utils.encoding import smart_str
content = smart_str(content)
30 голосов
/ 28 февраля 2011

Кажется, вы попали в метку порядка байтов UTF-8 (BOM). Попробуйте использовать эту строку Unicode с извлеченной спецификацией:

import codecs

content = unicode(q.content.strip(codecs.BOM_UTF8), 'utf-8')
parser.parse(StringIO.StringIO(content))

Я использовал strip вместо lstrip, потому что в вашем случае у вас было несколько экземпляров спецификации, возможно, из-за сцепленного содержимого файла.

7 голосов
/ 28 февраля 2011

Проблема в том, что вы пытаетесь распечатать символ Unicode на терминале, не являющемся Unicode.Вам необходимо закодировать его с помощью опции 'replace перед печатью, например, print ch.encode(sys.stdout.encoding, 'replace').

7 голосов
/ 28 февраля 2011

Проблема в соответствии с вашей трассировкой - это оператор print в строке 136 из parseXML.py. К сожалению, вы не сочли нужным опубликовать эту часть своего кода, но я собираюсь догадаться, что она предназначена только для отладки. Если вы измените его на:

print repr(ch)

тогда вы должны хотя бы увидеть, что вы пытаетесь напечатать.

0 голосов
/ 09 февраля 2017

Простым решением этой проблемы является установка кодировки по умолчанию utf8.Ниже приведен пример

import sys

reload(sys)
sys.setdefaultencoding('utf8')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...