2012年8月6日月曜日

jinja2 UnicodeEncodeError: 'ascii' codec can't encode characters

MAMPでjinja2を使おうとしていたら

[Mon Aug 06 14:29:41 2012] [error] [client ::1] UnicodeEncodeError: 'ascii' codec can't encode characters in position 141-147: ordinal not in range(128), referer: http://localhost:8888/

と出てしまった。ネットで解決方法を探してみると

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 0: ordinal not in range(128) - x-iteの日記: " import sys reload(sys) sys.setdefaultencoding('utf-8')"

というページを見つけた。

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

をプログラムに追加してみると、なぜかエラーもなく動いた。なんで?これでいいの?

[追記 2012年8月6日]

解決。いままでのコードは

print(tmpl.render())

となっていてrenderしたものをそのままprintしてエラーになっていたのだけど、tmpl.render()がUnicode型だったようだ。(よく考えたら当たり前か!?)
そのため、utf-8にエンコードして出力(Print)しないといけなかったんだ。ということで

print(tmpl.render().encode("utf-8"))

という風に書き換えたら普通に動いた。