2013-09-06 10 views
5

文書から、urllib.unquote_plusはスペースでプラス記号を再現する必要があります。 しかし、Python 2.7のIDLEで以下のコードを試してみましたが、それはしませんでした。urllib.unquote_plusはプラス記号をスペースに変換しません

>>s = 'http://stackoverflow.com/questions/?q1=xx%2Bxx%2Bxx' 
>>urllib.unquote_plus(s) 
>>'http://stackoverflow.com/questions/?q1=xx+xx+xx' 

私もやってみましたurllib.unquote_plus(s).decode('utf-8'). のようなものは、URLのコンポーネントをデコードすることが適切ありますか?

答えて

12

%2Bは、リテラルのエスケープコードです。+です。それは完全にエスケープされていません。

URLでこれを混同しないでくださいは、スペースのエスケープ文字である、+をエスケープ:

>>> s = 'http://stackoverflow.com/questions/?q1=xx+xx+xx' 
>>> urllib.unquote_plus(s) 
'http://stackoverflow.com/questions/?q1=xx xx xx' 

unquote_plus()はリテラルスペース('+' - >' ')にエンコードされたスペースをデコード+をエンコードされていません、シンボル('%2B' - >'+')。

あなたは、スペースを期待%2Bの代わりに使用しています+デコードへの入力を持っている場合は、これらの入力値は、おそらく二重、あなたは二回、それらをUNQUOTEする必要があると思い引用されました。

>>> urllib.quote_plus('Hello world!') 
'Hello+world%21' 
>>> urllib.quote_plus(urllib.quote_plus('Hello world!')) 
'Hello%2Bworld%2521' 
%25が引用され %文字です

:あなたはあまりにもエンコード%エスケープを参照してくださいね。

+0

あなたのコメントは、http://stackoverflow.com/questions/4737841/urlencoder-not-able-to-translate-space-characterと矛盾します。誰が正しいのか間違っているのかわからないが、これはPythonを使ってAPIを構築してAndroidを使って開発する人に、簡単に混乱させるものである。 – KVISH

+0

どのようにしてこの質問とこの回答が矛盾するのだろうか? –

+1

スペースは '+'にエンコードされますが、元のデータの '+'は '%2B'にエンコードされます。ここに矛盾はありません。エンコードされていない元のデータをエンコードされた結果と混同しています。 –

2

これらはスペースではなく、実際のプラスです。スペースは%20で、URLのその部分は実際に+と同じですが、%2Bはリテラルプラスを意味します。

関連する問題