UnicodeEncodeError:' ascii 'codec ne peut pas encoder le caractère u 'xef ' en position 0: ordinal pas dans la plage (128)

je veux analyser mon document XML. J'ai donc stocké mon document XML comme ci-dessous

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

maintenant mon code ci-dessous est mon code

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

je suis d'erreur ci-dessous

'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)   
70
demandé sur Vinay Sajip 2011-02-28 14:48:09

7 réponses

il semble que vous frappez une marque D'ordre UTF-8 octet (BOM). Essayez d'utiliser cette chaîne unicode avec BOM extrait:

import codecs

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

j'ai utilisé strip au lieu de lstrip parce que dans votre cas vous avez eu plusieurs occurrences de BOM, probablement en raison du contenu de fichier concaténé.

29
répondu Tugrul Ates 2013-03-09 22:17:33

la meilleure réponse réelle à ce problème dépend de votre environnement, en particulier de ce que l'encodage de votre terminal attend.

la solution la plus rapide consiste à encoder tout ce que vous imprimez en ASCII, ce que votre terminal est presque certain d'accepter, tout en éliminant les caractères que vous ne pouvez pas imprimer:

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

la meilleure solution est de changer l'encodage de votre terminal en utf-8, et de tout encoder en utf-8 avant impression. Vous devrait prendre l'habitude de penser à votre encodage unicode à chaque fois que vous imprimez ou lisez une chaîne.

112
répondu Triptych 2011-02-28 19:59:44

juste mettre .encode('utf-8') à la fin de l'objet fera le travail dans les versions récentes de Python.

53
répondu Nicole 2013-08-16 08:23:18

cela a fonctionné pour moi:

from django.utils.encoding import smart_str
content = smart_str(content)
30
répondu Orlando Pozo 2011-10-17 22:43:57

le problème selon votre retraçage est l'énoncé print à la ligne 136 de parseXML.py . Malheureusement vous n'avez pas jugé opportun de publier cette partie de votre code, mais je suppose qu'il est juste là pour le débogage. Si vous le changez en:

print repr(ch)

, alors vous devez voir au moins ce que vous essayez d'imprimer.

7
répondu Duncan 2011-02-28 12:23:21

le problème est que vous essayez d'imprimer un caractère unicode sur un terminal peut-être non unicode. Vous devez l'encoder avec l'option 'replace avant de l'imprimer, par exemple print ch.encode(sys.stdout.encoding, 'replace') .

7
répondu Rosh Oxymoron 2011-02-28 12:46:49

une solution facile pour surmonter ce problème est de définir votre encodage par défaut à utf8. Voici un exemple

import sys

reload(sys)
sys.setdefaultencoding('utf8')
-1
répondu Shafiq 2017-02-09 06:56:42