Vyhnout Python UnicodeDecodeError v nl2br filtru Jinja je

hlasů
6

Já používám Jinja2 je nl2br filtr, který vypadá takto:

import re
from jinja2 import environmentfilter, Markup, escape

_paragraph_re = re.compile(r'(?:\r\n|\r|\n){2,}')

@evalcontextfilter
def nl2br(eval_ctx, value):
    result = u'\n\n'.join(u'<p>%s</p>' % p.replace('\n', '<br>\n')
                      for p in _paragraph_re.split(escape(value)))
    if eval_ctx.autoescape:
        result = Markup(result)
    return result

Problém je, pokud „hodnota“ je něco jiného než ASCII znaky (například: „/ mɒntænə /“ způsobí, že selhání). Mám tuto chybu:

Traceback (most recent call last):
  File /usr/local/lib/python2.6/dist-packages/Flask-0.6.1-py2.6.egg/flask/app.py, line 889, in __call__
    return self.wsgi_app(environ, start_response)
  File /usr/local/lib/python2.6/dist-packages/Flask-0.6.1-py2.6.egg/flask/app.py, line 879, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File /usr/local/lib/python2.6/dist-packages/Flask-0.6.1-py2.6.egg/flask/app.py, line 876, in wsgi_app
    rv = self.dispatch_request()
  File /usr/local/lib/python2.6/dist-packages/Flask-0.6.1-py2.6.egg/flask/app.py, line 695, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File /home/mcrittenden/Dropbox/Code/dropdo/dropdo.py, line 105, in view
    return render_template(template, src = url, data = content)
  File /usr/local/lib/python2.6/dist-packages/Flask-0.6.1-py2.6.egg/flask/templating.py, line 85, in render_template
    context, ctx.app)
  File /usr/local/lib/python2.6/dist-packages/Flask-0.6.1-py2.6.egg/flask/templating.py, line 69, in _render
    rv = template.render(context)
  File /usr/local/lib/python2.6/dist-packages/Jinja2-2.5.5-py2.6.egg/jinja2/environment.py, line 891, in render
    return self.environment.handle_exception(exc_info, True)
  File /home/mcrittenden/Dropbox/Code/dropdo/templates/text.html, line 1, in top-level template code
    {% extends layout.html %}
  File /home/mcrittenden/Dropbox/Code/dropdo/templates/layout.html, line 25, in top-level template code
    {% block content %}{% endblock %}
  File /home/mcrittenden/Dropbox/Code/dropdo/templates/text.html, line 8, in block content
    {{ data|nl2br }}
  File /home/mcrittenden/Dropbox/Code/dropdo/dropdo.py, line 26, in nl2br
    for p in _paragraph_re.split(escape(value)))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc9 in position 12: ordinal not in range(128)

Jaký je nejlepší, aby se zabránilo chybu, ale neodstraní znaky problémových dohromady?

Položena 25/02/2011 v 18:09
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
13

Použít unicodeliterály všude.

„Unicode v Pythonu, Kompletně mýtů zbavená“

Odpovězeno 25/02/2011 v 18:11
zdroj uživatelem

hlasů
6

Pokud „hodnota“ je něco jiného než ASCII znaky, budete chtít, aby byl Unicode, a nic než Unicode, po celou dobu své aplikace, s výjimkou několika míst, kde se výslovně kódují nebo dekódovat. Projít Unicode do šablon, taky.

Pokud získáte řetězec „/ mɒntænə /“ nějak, budete pravděpodobně znát jeho kódování; použití: value = "/mɒnˈtænə/".decode(the_encoding).

Jak se naučit kódování? Požadavek HTTP zná jeho kódování. XML soubor, který zná jeho kódování. Prostý textový soubor, obvykle není; musíte znát jeho kódování nějakým jiným způsobem.

Všimněte si, že UTF-8 není Unicode když se jedná o kódování, které může plně zastupovat Unicode. Je to stále kódování, a získat řetězec Python Unicode z něj, je třeba .decode("utf-8")ji.

Odpovězeno 25/02/2011 v 18:29
zdroj uživatelem

hlasů
0

Zkuste unidecode z http://pypi.python.org/pypi/Unidecode

>>> from unidecode  import unidecode
>>> m=u'My fianc\xe9 David'; print m; print unidecode(m)
My fiancé David
My fiance David
>>> 
Odpovězeno 21/08/2013 v 15:38
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more