Frage

Ich versuche, den Inhalt einer DB-Tabelle zu lesen und als Webseite mit mako und bottle anzuzeigen.Die Tabelle enthält einige Unicode-Felder (utf-8).

UnicodeDecodeError('ascii', 'MOTOROLA MILESTONE\xe2\x84\xa2 PLUS', 
                   18, 19, 'ordinal not in range(128)')

Mit der folgenden Stapelverfolgung:

Traceback (most recent call last):
  File "/workspace/web/controller/bottle.py", line 499, in handle
    return handler(**args)
  File "webserver/webserver.py", line 101, in download
    return html_tmpl(tmpl, **kwds)
  File "webserver/webserver.py", line 116, in html_tmpl
    return tmpl.render(**kwds)
  File "/usr/lib/python2.5/site-packages/Mako-0.3.4-py2.5.egg/mako/template.py", line 189, in render
    return runtime._render(self, self.callable_, args, data)
  File "/usr/lib/python2.5/site-packages/Mako-0.3.4-py2.5.egg/mako/runtime.py", line 403, in _render
    _render_context(template, callable_, context, *args, **_kwargs_for_callable(callable_, data))
  File "/usr/lib/python2.5/site-packages/Mako-0.3.4-py2.5.egg/mako/runtime.py", line 434, in _render_context
    _exec_template(inherit, lclcontext, args=args, kwargs=kwargs)
  File "/usr/lib/python2.5/site-packages/Mako-0.3.4-py2.5.egg/mako/runtime.py", line 457, in _exec_template
    callable_(context, *args, **kwargs)
  File "download_android_index_html", line 41, in render_body
  File "download_android_index_html", line 23, in fill_devices
  File "download_android_index_html", line 68, in render_fill_devices
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 18: ordinal not in range(128)

Die aufrufende Funktion lautet:

def html_tmpl(tmpl, **kwds):
    kwds['nav'] = templates_lookup.get_template('nav.html').render()
    kwds['nav_bottom'] = templates_lookup.get_template('nav_bottom.html').render()
    base_path = request.path.replace("de/","").replace("fr/","")
    kwds['languages'] = templates_lookup.get_template('languages.html').render(en_url=base_path,fr_url="/fr"+base_path)
    kwds['analytics'] = ''
    return tmpl.render(**kwds)

Wie gehe ich vor?Ich habe versucht:

return tmpl.render_unicode(**kwds)` 

und

return tmpl.render_unicode(**kwds).encode('utf-8', 'replace')

ohne Glück und diese Antwort hat nicht viel geholfen.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Das Problem ist nicht, dass render_unicode ein Python-Unicode-Objekt nicht in utf8 konvertieren kann, sondern dass ein String-Objekt existiert, von dem angenommen wird, dass es ASCII ist und das keine ASCII-Daten enthält.

Beginnen Sie am Anfang - dekodieren Sie alle eingehenden Zeichenfolgen intern in Unicode.Sie haben eine Zeichenfolgeneingabe, die korrigiert werden muss.

Ich schlage vor, Sie versuchen, alle Variablen an der Grenze mit einer Art ungarischer Notation zu benennen - vielleicht rawstr_myvar und u_myvar.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top