24

バージョン: Python 2.7.3

その他のライブラリ: Python-Requests 1.2.3、jinja2 (2.6)

フォーラムにデータを送信するスクリプトがありますが、非 ASCII 文字がガベージとして表示されるという問題があります。たとえば、アンドレ・テシネのような名前は、アンドレ・テシネとして出てきます。

データの送信方法は次のとおりです。

1) データは最初に次のように UTF-8 でエンコードされた CSV ファイルからロードされます。

entries = []
with codecs.open(filename, 'r', 'utf-8') as f:
    for row in unicode_csv_reader(f.readlines()[1:]):
        entries.append(dict(zip(csv_header, row)))

unicode_csv_reader は、Python CSV ドキュメント ページの下部にあります: http://docs.python.org/2/library/csv.html

インタープリターにエントリ名を入力すると、名前がu'Andr\xe9 T\xe9chin\xe9'.

2) 次に、jinja2 を使用してデータをレンダリングします。

tpl = tpl_env.get_template(u'forumpost.html')
rendered = tpl.render(entries=entries)

インタープリターでレンダリングされた名前を入力すると、同じことが再び表示されます。u'Andr\xe9 T\xe9chin\xe9'

ここで、レンダリングされた変数を次のようなファイル名に書き込むと、正しく表示されます。

with codecs.open('out.txt', 'a', 'utf-8') as f:
    f.write(rendered)

しかし、フォーラムに送信する必要があります。

3)私が持っているPOSTリクエストコードで:

params = {u'post': rendered}
headers = {u'content-type': u'application/x-www-form-urlencoded'}
session.post(posturl, data=params, headers=headers, cookies=session.cookies)

session は Requests セッションです。

また、フォーラムの投稿では名前が壊れて表示されます。私は次のことを試しました:

  • ヘッダーを除外する
  • render.encode('utf-8') としてレンダリングされたエンコード (同じ結果)
  • render = urllib.quote_plus(rendered) (すべて %XY として出力されます)

render.encode('utf-8') と入力すると、次のように表示されます。

'Andr\xc3\xa9 T\xc3\xa9chin\xc3\xa9'

どうすれば問題を解決できますか? ありがとう。

4

2 に答える 2

2

utf8 にデコードしてみてください:

unicode(my_string_variable, "utf8")

またはデコードしてエンコードします。

sometext = gettextfromsomewhere().decode('utf-8')
env = jinja2.Environment(loader=jinja2.PackageLoader('jinjaapplication', 'templates'))
template = env.get_template('mypage.html')
print template.render( sometext = sometext ).encode('utf-8')
于 2013-07-02T06:11:12.003 に答える