好的,我已经阅读了所有unicode / mako帖子,但我仍然可以使用这个简单的代码

时间:2012-12-06 04:03:58

标签: unicode mako

我正在运行Python 2.6.6。

  

cat tbuild.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#

from mako.template import Template

_template="""
% for v in my_list:
  ${'abc'.encode('utf-8')}
  ${'風連町?'.encode('utf-8')}
% endfor
"""


print Template(_template).render_unicode(my_list = [1, 2],
                                         input_encoding='utf-8',
                                         output_encoding='utf-8',
                                         encoding_errors='replace'
                                        )

./tbuild.py gives.
  File "./tbuild.py", 
  line 15, in <module> print Template(_template).render_unicode(my_list = [1, 2],
  File "/usr/lib/python2.6/site-packages/mako/template.py", 
  line 91, in __init__ (code, module) = _compile_text(self, text, filename)
  File "/usr/lib/python2.6/site-packages/mako/template.py", 
  line 357, in _compile_text node = lexer.parse()
  File "/usr/lib/python2.6/site-packages/mako/lexer.py", 
  line 192, in parse self.filename,)
  File "/usr/lib/python2.6/site-packages/mako/lexer.py", 
  line 184, in decode_raw_stream 0, 0, filename)
  mako.exceptions.CompileException: Unicode decode operation of 
  encoding 'ascii' failed at line: 0 char: 0

如果我用日语删除该行,它可以正常工作。 显然有一些基本的东西我很想理解。

感谢您的帮助, EO

1 个答案:

答案 0 :(得分:2)

即使${'á'.encode('utf-8')}有效,我也会感到惊讶。您需要使用unicode文字u来指定unicode字符串。将${'風連町?'.encode('utf-8')}重写为${u'風連町?'.encode('utf-8')}并对您正在处理的任何文本执行相同操作。

编辑:

考虑到mako:

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

from mako.template import Template

_template=u"${u'風連町?'}"
x = Template(_template, output_encoding='utf-8')
print x.render()

output_encoding参数在创建模板时有意义,它在render方法中没有意义。另外,为什么要使用相同的编码对输入进行编码,解码输入,然后使用render_unicode?实际上,render_unicode忽略了output_encoding,所以看起来你真的想要使用render。