web-dev-qa-db-ja.com

PythonエンコーディングのリクエストPOST data

バージョン:Python 2.7.3

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

フォーラムにデータを送信するスクリプトがありますが、問題は非ASCII文字がゴミとして表示されることです。例えば、AndréTéchinéのような名前はAndré©Téchinéとして出てきます。

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

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)

セッションはリクエストセッションです。

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

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

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

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

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

21
TheMagician

クライアントは正常に動作します。 nc -l 8888をサーバーとして実行し、リクエストを作成します。

import requests

requests.post('http://localhost:8888', data={u'post': u'Andr\xe9 T\xe9chin\xe9'})

ショー:

POST / HTTP/1.1
Host: localhost:8888
Content-Length: 33
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate, compress
Accept: */*
User-Agent: python-requests/1.2.3 CPython/2.7.3

post=Andr%C3%A9+T%C3%A9chin%C3%A9

正しいことを確認できます。

>>> import urllib
>>> urllib.unquote_plus(b"Andr%C3%A9+T%C3%A9chin%C3%A9").decode('utf-8')
u'Andr\xe9 T\xe9chin\xe9'
  • サーバーがリクエストを正しくデコードしていることを確認してください。あなたは文字セットを指定しようとすることができます:

    headers = {"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"}
    

    本体にはASCII文字のみが含まれているため、傷つくことはなく、正しいサーバーはx-www-form-urlencodedタイプのパラメーターを無視します。 RLエンコードされたフォームデータ で詳細な情報を探します

  • 問題が表示アーチファクトではないことを確認します。つまり、値は正しいが、正しく表示されない

28
jfs

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')
2
dikkini