2011-09-12 11 views
2

DBテーブルの内容を読み込み、makobottleを使用してWebページとして表示しようとしています。テーブルにはUnicode(utf-8)のフィールドがいくつかあります。次のスタックトレースでPython + mako Unicodeの問題

UnicodeDecodeError('ascii', 'MOTOROLA MILESTONE\xe2\x84\xa2 PLUS', 
        18, 19, 'ordinal not in range(128)') 

Traceback (most recent call last): 
    File "/workspace/web/controller/bottle.py", line 499, in handle 
    return handler(**args) 
    File "webserver/webserver.py", line 101, in download 
    return html_tmpl(tmpl, **kwds) 
    File "webserver/webserver.py", line 116, in html_tmpl 
    return tmpl.render(**kwds) 
    File "/usr/lib/python2.5/site-packages/Mako-0.3.4-py2.5.egg/mako/template.py", line 189, in render 
    return runtime._render(self, self.callable_, args, data) 
    File "/usr/lib/python2.5/site-packages/Mako-0.3.4-py2.5.egg/mako/runtime.py", line 403, in _render 
    _render_context(template, callable_, context, *args, **_kwargs_for_callable(callable_, data)) 
    File "/usr/lib/python2.5/site-packages/Mako-0.3.4-py2.5.egg/mako/runtime.py", line 434, in _render_context 
    _exec_template(inherit, lclcontext, args=args, kwargs=kwargs) 
    File "/usr/lib/python2.5/site-packages/Mako-0.3.4-py2.5.egg/mako/runtime.py", line 457, in _exec_template 
    callable_(context, *args, **kwargs) 
    File "download_android_index_html", line 41, in render_body 
    File "download_android_index_html", line 23, in fill_devices 
    File "download_android_index_html", line 68, in render_fill_devices 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 18: ordinal not in range(128) 

呼び出し関数は次のとおりです。

def html_tmpl(tmpl, **kwds): 
    kwds['nav'] = templates_lookup.get_template('nav.html').render() 
    kwds['nav_bottom'] = templates_lookup.get_template('nav_bottom.html').render() 
    base_path = request.path.replace("de/","").replace("fr/","") 
    kwds['languages'] = templates_lookup.get_template('languages.html').render(en_url=base_path,fr_url="/fr"+base_path) 
    kwds['analytics'] = '' 
    return tmpl.render(**kwds) 

にはどうすればaboutthisを行くのですか?運と

return tmpl.render_unicode(**kwds)` 

return tmpl.render_unicode(**kwds).encode('utf-8', 'replace') 

を、そしてthis answerはあまり役に立ちませんでした:私が試してみました。

アイデア?

答えて

1

render_unicodeは、Pythonのunicodeオブジェクトをutf8に変換することはできません。そのオブジェクトは、asciiとみなされ、非ASCIIデータを保持する文字列オブジェクトが存在します。

開始時に開始 - すべての受信文字列をユニコードに内部的にデコードします。固定が必要な文字列入力があります。

境界線にあるすべての変数に、ハンガリー語の表記(rawstr_myvarとu_myvarなど)を付けて名前を付けることをお勧めします。