5 votes

UnicodeEncodeError : le codec 'ascii' ne peut pas encoder les caractères en position 1-4 : ordinal n'est pas dans la plage(128)

Je vois des tonnes de questions liées à ce sujet mais je n'arrive pas à trouver la solution.

Ceci se fait sur Django 1.4 et Python 2.7.

data est un dictionnaire qui contient des caractères UTF8. Voir cette ligne :

render_to_response('application/app.html', data, context_instance=RequestContext(request))

Le modèle est rendu qui produit des valeurs à partir de ce modèle. data .

Pourquoi explose-t-il et que puis-je faire pour y remédier ?

EDIT : Après avoir creusé, une partie de ce data contient lxml.objectify.ObjectifiedElement . Il s'agit essentiellement d'un élément XML qui peut être interrogé comme un dictionnaire normal. Les valeurs qu'il produit semblent être des chaînes unicode correctes comme celle-ci : u'\xae\u2020\xa5\xa8\u02c6\xf8'

Voici la trace de la pile complète :

File "/web/mysite/env/lib/python2.7/site-packages/django/core/handlers/base.py", line 111, in get_response
  response = callback(request, *callback_args, **callback_kwargs)

File "/web/mysite/current/api/views.py", line 163, in invoice
  return render_to_response('application/app.html', data, context_instance=RequestContext(request))

File "/web/mysite/env/lib/python2.7/site-packages/django/shortcuts/__init__.py", line 20, in render_to_response
  return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)

File "/web/mysite/env/lib/python2.7/site-packages/django/template/loader.py", line 176, in render_to_string
  return t.render(context_instance)

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 140, in render
  return self._render(context)

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 134, in _render
  return self.nodelist.render(context)

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 823, in render
  bit = self.render_node(node, context)

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 837, in render_node
  return node.render(context)

File "/web/mysite/env/lib/python2.7/site-packages/django/template/loader_tags.py", line 123, in render
  return compiled_parent._render(context)

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 134, in _render
  return self.nodelist.render(context)

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 823, in render
  bit = self.render_node(node, context)

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 837, in render_node
  return node.render(context)

File "/web/mysite/env/lib/python2.7/site-packages/django/template/loader_tags.py", line 62, in render
  result = block.nodelist.render(context)

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 823, in render
  bit = self.render_node(node, context)

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 837, in render_node
  return node.render(context)

File "/web/mysite/env/lib/python2.7/site-packages/django/template/defaulttags.py", line 281, in render
  return nodelist.render(context)

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 823, in render
  bit = self.render_node(node, context)

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 837, in render_node
  return node.render(context)

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 880, in render
  return _render_value_in_context(output, context)

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 858, in _render_value_in_context
  value = force_unicode(value)

File "/web/mysite/env/lib/python2.7/site-packages/django/utils/encoding.py", line 74, in force_unicode
  s = unicode(str(s), encoding, errors)

UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-4: ordinal not in range(128)

4voto

Ignacio Vazquez-Abrams Points 312628

Il devrait pas contient des caractères UTF-8 ; il doit contenir unicode s.

{'foo': u'bar'}

0voto

zvin Points 1

Les valeurs dans lxml.objectify.ObjectifiedElement ne sont pas vraiment unicode. Vous pouvez utiliser le wrapper suivant autour de votre objet ObjectifiedElement :

from lxml.objectify import ObjectifiedElement, StringElement

class LxmlUnicodeWrapper(object):
    """Avoids UnicodeEncodeError when using ObjectifiedElement in templates."""
    def __init__(self, xml):
        self.xml = xml

    def __getattribute__(self, name):
        item = getattr(object.__getattribute__(self, "xml"), name)
        if type(item) == ObjectifiedElement:
            return LxmlUnicodeWrapper(item)
        elif type(item) == StringElement:
            return unicode(item)
        else:
            return item

puis

def some_view(request):
    return render_to_response(
        "some_template.html",
        {
            "xml_data": LxmlUnicodeWrapper(your_xml_object)
        },
    )

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