76 votes

UnicodeEncodeError: le codec 'ascii' ne peut pas coder le caractère u '\ xef' en position 0: l'ordinal n'est 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 ci-dessous est mon code

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

J'obtiens une erreur

 '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)   
 

112voto

Triptych Points 70247

La réelle meilleure réponse à ce problème dépend de votre environnement, plus précisément ce que le codage de votre terminal attend.

Le moyen le plus rapide d'une ligne solution est de coder tout ce que vous imprimez au format ASCII, votre terminal est presque certain que les 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 de terminal s l'encodage en utf-8, et de coder tout en utf-8 avant l'impression. Vous devriez prendre l'habitude de penser au sujet de votre encodage unicode CHAQUE fois que vous imprimez ou de lire une chaîne de caractères.

56voto

Nicole Points 131

Il suffit de mettre .encode('utf-8') à la fin de l’objet pour effectuer le travail dans les versions récentes de Python.

30voto

junjanes Points 4858

Il semble que vous frappiez une marque d'ordre d'octet (BOM) UTF-8. Essayez d’utiliser cette chaîne unicode avec la nomenclature extraite:

 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 aviez plusieurs occurrences de nomenclature, probablement en raison du contenu concaténé du fichier.

30voto

Orlando Pozo Points 201

Cela a fonctionné pour moi:

 from django.utils.encoding import smart_str
content = smart_str(content)
 

8voto

Duncan Points 25356

Le problème selon votre traçage est la déclaration print sur la ligne 136 de parseXML.py . Malheureusement, vous n'avez pas jugé bon de publier cette partie de votre code, mais je suppose que ce n'est que pour le débogage. Si vous le changez en:

 print repr(ch)
 

alors vous devriez au moins voir ce que vous essayez d’imprimer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X