как иметь дело с unicode у акулы-мако?

Я постоянно получаю эту ошибку с помощью акулы-мако:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 6: ordinal not in range(128)

Я сказал акуле-мако, что использую unicode любым возможным способом:

    mylookup = TemplateLookup(
        directories=['plugins/stl/templates'],
        input_encoding='utf-8',
        output_encoding='utf-8',
        default_filters=['decode.utf8'],
        encoding_errors='replace')

    self.template = Template(self.getTemplate(), lookup=mylookup,
        module_directory=tempfile.gettempdir(),
        input_encoding='utf-8',
        output_encoding='utf-8',
        default_filters=['decode.utf8'],
        encoding_errors='replace')

    html = self.template.render_unicode(data=self.stuff)

Все мои шаблонные файлы запускаются с:

## -*- coding: utf-8 -*-

и в них все строки costant снабжаются префиксом "u". Я знаю, что self.stuff параметр содержит строки unicode, но способ, которым я инстанцирую объектов акулы-мако, должен заботиться о нем (иначе, для чего те аргументы хороши?). Есть ли что-нибудь, что я забыл делать?

Еще один вопрос: какой смысл encoding_errors ='replace'?

=EDIT = я оставил только единственную строку unicode, и это - traceback:

Traceback (most recent call last):
  File "C:\My Dropbox\src\flucso\src\plugins\stl\main.py", line 240, in updateView
    flags=self.makoflags)
  File "C:\Python26\lib\site-packages\mako-0.3.4-py2.6.egg\mako\template.py", line 198, in render_unicode
    as_unicode=True)
  File "C:\Python26\lib\site-packages\mako-0.3.4-py2.6.egg\mako\runtime.py", line 403, in _render
    _render_context(template, callable_, context, *args, **_kwargs_for_callable(callable_, data))
  File "C:\Python26\lib\site-packages\mako-0.3.4-py2.6.egg\mako\runtime.py", line 434, in _render_context
    _exec_template(inherit, lclcontext, args=args, kwargs=kwargs)
  File "C:\Python26\lib\site-packages\mako-0.3.4-py2.6.egg\mako\runtime.py", line 457, in _exec_template
    callable_(context, *args, **kwargs)
  File "memory:0x41317f0", line 89, in render_body
  File "C:\Python26\lib\site-packages\mako-0.3.4-py2.6.egg\mako\runtime.py", line 278, in <lambda>
    return lambda *args, **kwargs:callable_(self.context, *args, **kwargs)
  File "FriendFeed_mako", line 49, in render_inlist_entry
  File "C:\Python26\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u263c' in position 8: ordinal not in range(128)
13
задан Giorgio Gelardi 26 July 2010 в 12:46
поделиться

1 ответ

наконец, я сохранил свои шаблоны в юникоде, на самом деле (я думаю) utf-16 вместо utf-8. их размер на диске увеличился вдвое, и Мако начал жаловаться на "CompileException (" операция декодирования Unicode для кодирования 'utf-8' bla bla ", поэтому я изменил первую строку во всех из них в:

## -*- coding: utf-16 -*-

и удалено все строки констант «.decode ('utf-8')» по-прежнему имеют префикс «u».

инициализации в python теперь следующие:

mylookup = TemplateLookup(
    directories=['plugins/stl/templates'],
    input_encoding='utf-16',
    output_encoding='utf-16',
    encoding_errors='replace')

self.template = Template(self.getTemplate(), lookup=mylookup,
    module_directory=tempfile.gettempdir(),
    input_encoding='utf-16',
    output_encoding='utf-16',
    encoding_errors='replace')

теперь он работает. Похоже, что utf-8 был неправильный выбор (или моя неспособность сохранить шаблоны в utf-8), но я не могу объяснить, почему это сработало из eclipse / pydev.

13
ответ дан 2 December 2019 в 00:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: