2012-07-18 10 views
5

Vedo tonnellate di domande correlate ma non riesco a capire la soluzione.UnicodeEncodeError: il codec 'ascii' non può codificare i caratteri nella posizione 1-4: ordinale non compreso nell'intervallo (128)

Questo è su Django 1.4 e Python 2.7.

data è un dizionario che contiene caratteri UTF8. Vedere questa linea:

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

modello viene eseguito il rendering che emette i valori da quella data.

Perché esplode e cosa posso fare per risolvere il problema?

EDIT: Dopo scavare intorno, parte di tale data contiene lxml.objectify.ObjectifiedElement. Fondamentalmente un elemento XML che può essere interrogato come un normale dizionario. I valori che essa produce sembrano essere corrette stringhe Unicode come questo: u'\xae\u2020\xa5\xa8\u02c6\xf8'

Ecco lo stacktrace completo:

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) 
+0

File "/web/mysite/current/api/views.py", la linea 163, in fattura –

risposta

4

Dovrebbe non contenere caratteri UTF-8; dovrebbe contenere unicode s.

+0

Gotcha. Ho scoperto che i dati contengono lxml.objectify.ObjectifiedDataElement e chissà che wtf sia all'interno di quello. – Grocery

+0

Ok, quell'oggetto lxml ha attributi accessibili come un dict. Tutti i valori sembrano essere unicode come questo: 'u '\ xae \ u2020 \ xa5 \ xa8 \ u02c6 \ xf8''. Quindi qualche indizio su cosa potrebbe esplodere? – Grocery

+0

@Grocery potresti accettare la risposta se ha funzionato per te. – n611x007

0

I valori in lxml.objectify.ObjectifiedElement non sono realmente unicode. È possibile utilizzare il seguente involucro intorno al vostro oggetto 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 

poi

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