答案 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)