2012-07-18 12 views
5

Widzę mnóstwo pytań, które są z tym związane, ale nie mogę znaleźć rozwiązania.UnicodeEncodeError: Kodek 'ascii' nie może kodować znaków w pozycji 1-4: porządkowy nie w zakresie (128)

Jest to na Django 1.4 i Pythonie 2.7.

data to słownik zawierający znaki UTF8. Zobacz tę linię:

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

Szablon pobiera renderowane że wyprowadza wartości z tego data.

Dlaczego eksploduje i co mogę zrobić, aby to naprawić?

EDYTOWANIE: Po zakończeniu kopania część tego data zawiera lxml.objectify.ObjectifiedElement. Zasadniczo element XML, który można zapytać jak zwykły słownik. Wartości, które wytwarza się wydawać odpowiednie ciągi Unicode, takie jak ten: u'\xae\u2020\xa5\xa8\u02c6\xf8'

Oto pełna StackTrace:

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

Plik "/web/mysite/current/api/views.py", linia 163, w fakturze –

Odpowiedz

4

Powinno nie zawierać znaków UTF-8; powinien zawierać unicode s.

{'foo': u'bar'} 
+0

Gotcha. Odkryłem, że dane zawierają lxml.objectify.ObjectifiedDataElement i kto wie, wtf jest w tym. – Grocery

+0

Ok, ten obiekt lxml ma atrybuty dostępne jak dyktafon. Wszystkie wartości wyglądają tak jak Unicode: 'u '\ xae \ u2020 \ xa5 \ xa8 \ u02c6 \ xf8''. Więc jakąkolwiek wskazówkę, co to może wysadzić? – Grocery

+0

@ Można zaakceptować odpowiedź, jeśli zadziałało. – n611x007

0

Wartości w lxml.objectify.ObjectifiedElement tak naprawdę nie stanowią kodu Unicode. Można użyć następującego owijkę wokół ObjectifiedElement obiektu:

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 

następnie

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