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)
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é.
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.
juste mettre .encode('utf-8')
à la fin de l'objet fera le travail dans les versions récentes de Python.
cela a fonctionné pour moi:
from django.utils.encoding import smart_str
content = smart_str(content)
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.
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')
.
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')