3

非常に珍しい問題があります。python 2.6を使用して、bulkSMSゲートウェイへのAPI呼び出しを行っています。今、私がこのように電話をかけると

req = urllib2.Request(url)
urllib2.urlopen(req).read()

この(正しい)応答が端末に出力されます

'<RESPONSE>\r<status>-4</status>\r<credits>31.3403</credits>\r</RESPONSE>'

しかし、この出力を変数に割り当てると、

reply = urllib2.urlopen(req).read()

端末に印刷すると、この(誤った)応答が返されます

print reply
</RESPONSE>.3403</credits>

誰かがここで何が起こっているのか説明したいと思いますか?

4

2 に答える 2

3

\rこれは、文字を特殊文字として解釈し(ASCIIキャリッジリターン-いくつかの例についてはここを参照)、印刷時に文字列から削除します。それらを含めるには、string-escapeエンコーディングを使用できます。

In [1]: resp = '<RESPONSE>\r<status>-4</status>\r<credits>31.3403</credits>\r</RESPONSE>'

In [2]: print resp
</RESPONSE>.3403</credits>

In [3]: print resp.encode('string-escape')
<RESPONSE>\r<status>-4</status>\r<credits>31.3403</credits>\r</RESPONSE>

あなたの場合には直接適用できませんが、この種のエスケープが行われる別の方法は、文字列の前に。を付けることですr。これにより、文字列が「生の」文字列になり、バックスラッシュが保持されます(これは正規表現でよくわかります)。

In [4]: resp = r'<RESPONSE>\r<status>-4</status>\r<credits>31.3403</credits>\r</RESPONSE>'

In [5]: print resp
<RESPONSE>\r<status>-4</status>\r<credits>31.3403</credits>\r</RESPONSE>
于 2012-12-20T02:36:19.937 に答える
2

文字列には正しいデータが含まれています。奇妙な方法で印刷されているだけです。 \rはキャリッジリターンであり、一部のシステムは「行の先頭に戻ってそこから上書きを開始する」と解釈します。したがって"</RESPONSE>"、前の行のより長い(したがって上書きされなかった)データが表示されます。

\r最近の行末規則ほど一般的ではないため、データに含まれているのは少し奇妙です。

このように解釈せずに、印刷repr(response)して応答を確認できます。\rすべてのデータがそこにあるので、ライン上で行う処理はすべて正常に機能するはずです。印刷ではありません。

于 2012-12-20T02:39:24.267 に答える