2013-07-02 19 views
20

バージョン:2.7.3 PythonのPythonの要求エンコーディングPOSTデータ

他のライブラリ:Pythonの-要求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) 

しかし、私は、フォーラムに送信する必要があります:このようなファイル名は、それが正しく表示さ

0123私が持っているPOST要求コードで

3):

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

セッションが要求セッションです。

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

  • はrendered.encode( 'UTF-8')(同じ結果)レンダリング
  • としてレンダリングエンコード= urllib.quote_plus(レンダリング)は(として出てくる
  • ヘッダを除外します私はrendered.encode( 'UTF-8')を入力すると、すべて%XY)

は、私は以下を参照してください。

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

私は問題を解決できますか?ありがとう。 UTF8にデコードする

答えて

24

あなたのクライアントは、それが例えば必要として振る舞いますサーバとして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' 
  • は、サーバーが要求を解読チェック正しくあなたは、文字セットを指定しようとすることができます:それは傷つけるべきではないと、正しいサーバーがとにかくx-www-form-urlencodedタイプのための任意のパラメータを無視するよう

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

    体は、ASCII文字のみが含まれています。問題は、すなわち表示アーチファクトではありません確認し、」値が正しいですが、それは間違って

+0

表示問題、すなわち表示アーチファクトではありませんチェックURL-encoded form data

  • に血みどろの詳細を探し、値が正しいですかそれは間違って表示される " - ありがとう。それが問題です!残念ながら、これは公開フォーラムであり、デフォルトのエンコーディングを変更することはできません。これはiso-8859-1エンコーディングで応答します。 rendered.encode( 'iso-8859-1')を使うことができますか?ありがとう。 – TheMagician

  • +1

    ヘッダーに文字セットを設定しようとしました – jfs

    +0

    それは動作しませんでした。 – TheMagician

    1

    試してみてください。

    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') 
    
    関連する問題