1

Robot フレームワークを使用して、いくつかの HTTP POST 関連のテストを自動化しています。HTTP POST を実行する関数を持つカスタム Python ライブラリを作成しました。次のようになります。

# This function will do a http post and return the json response
def Http_Post_using_python(json_dict,url):
    post_data = json_dict.encode('utf-8')
    headers = {}
    headers['Content-Type'] = 'application/json'
    h = httplib2.Http()
    resp, content = h.request(url,'POST',post_data,headers)
    return resp, content

Unicode 文字を使用していない限り、これは正常に機能します。変数に Unicode 文字json_dict(たとえば、메시지) があると、次のエラーで失敗します。

UnicodeDecodeError: 'ascii' コーデックは位置 164 のバイト 0xeb をデコードできません: 序数が範囲外です (128)

Windows 7 で Python 2.7.3 を実行しています。関連する質問をいくつか見ましたが、問題を解決できませんでした。私はPythonとプログラミングが初めてなので、助けていただければ幸いです。

ありがとう。

4

3 に答える 3

2

ではなく であるjson_dictため、このエラーが発生します。アプリケーションについて他に何も知らなくても、簡単な解決策は次のとおりです。strunicode

if isinstance(json_dict, unicode):
    json_dict = json_dict.encode("utf-8")
post_data = json_dict

ただし、 を使用json.dumps(…)して を作成しているjson_dict場合は、エンコードする必要はありません。エンコードは によって行われjson.dumps(…)ます。

于 2012-11-20T21:04:26.300 に答える
1

使用requests:

requests.post(url, data=data, headers=headers)

それはあなたのためにエンコーディングを扱います。


Python 2 の自動エンコード/デコードが原因でエラーが発生しています。これは基本的にバグであり、Python 3 で修正されました。簡単に言えば、Python 2 のstrオブジェクトは実際には「バイト」であり、文字列データを処理する正しい方法はunicode物体。s は後で導入されたのでunicode、Python 2 はそれらと文字列を混同すると自動的に変換しようとします。そのためには、エンコーディングを知る必要があります。ascii1つを指定しないため、必要な文字がないものがデフォルトになります。

Python が自動的にデコードしようとするのはなぜですか? オブジェクトを呼び出し.encode()ているからです。str既にエンコードされているため、Python はまずデコードを試み、asciiエンコードを推測します。


The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)を読む必要があります。

于 2012-11-20T21:04:42.203 に答える
-3

これを試して:

#coding=utf-8
test = "메시지" 
test.decode('utf8')

この行#coding=utf-8では、ファイル エンコーディングを UTF-8 に設定しました ("메시지" と書けるようにするため)。

文字列を utf-8 にデコードする必要があります。デコード方法のドキュメント

于 2012-11-20T21:07:16.173 に答える