时间:2010-07-26 09:19:18

标签: python unicode mako

3 个答案:

答案 0 :(得分:13)

最后我将模板保存在unicode中,实际上(我猜)utf-16而不是utf-8。它们在磁盘上的大小加倍,并且mako开始抱怨“CompileException(”编码'utf-8'bla bla'的Unicode解码操作,所以我改变了所有这些中的第一行:

## -*- 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中解决。

答案 1 :(得分:1)

为了googlers:

当模板文件包含非ascii字符,以及未将Unicode BOM写入文件时,Mako会引发异常mako.exceptions.CompileException: Unicode decode operation of encoding 'ascii' failed in file等。您需要手动添加BOM(这不是自动生成的,至少在我的文本编辑器中),所以这样:

$file test.htm
test.htm: HTML document, UTF-8 Unicode text

成为这个:

$file test.htm
test.htm: HTML document, UTF-8 Unicode (with BOM) text

答案 2 :(得分:0)

这些建议(包括接受的答案)都不适用于所有情况,特别是在mako模板呈现内容(例如$ {value | n})的情况下,其中值包含非ascii字符。

这是因为默认情况下,mako将unicode(foo)包装在生成的已编译模板中的任何值周围,这仍然会导致:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)

在python2中使mako处理unicode的唯一可靠方法是替换默认的(' unicode')处理程序,如下所示:

def handle_unicode(value):
    if isinstance(value, basestring):
        return unicode(value.decode('ascii', errors='ignore'))
    return unicode(value)


...    

lookup = TemplateLookup(
    directories=[self._root.template_path],
    imports=['from utils.view import handle_unicode'],
    default_filters=["handle_unicode"]
)

...

template = self._lookup.get_template(self.template())
rtn = template.render(request=self.request)