[英]URL encoding/decoding with Python
我正在嘗試編碼和存儲,並解碼Python中的參數並在此過程中丟失。 這是我的步驟:
1)我使用google toolkit的gtm_stringByEscapingForURLArgument
正確轉換NSString以傳入HTTP參數。
2)在我的服務器(python)上,我將這些字符串參數存儲為
u'1234567890-/:;()$&@".,?!\\'[]{}#%^*+=_\\\\|~<>\€\\xa3\\xa5\•.,?!\\''
(請注意,這些是“123”視圖中的iphone鍵盤上的標准鍵和“#+ =”視圖, \\u\u003c/code>和
\\x
有一些貨幣前綴,如英鎊,日元等)
3)我在該存儲值上調用
urllib.quote(myString,'')
,大概是為了將它們轉移到客戶端,以便客戶端可以取消它們的轉義。
結果是當我嘗試記錄%escaping的結果時出現異常。 是否有一些關鍵的步驟我忽略了需要應用於\\ u和\\ x格式的存儲值才能正確轉換它以通過http發送?
更新 :標記為以下答案的建議對我有用。 不過,我提供了一些更新來解決以下評論。
我收到的例外引用了
\€
一個問題。 我不知道具體是否是一個問題,而不是它是字符串中的第一個unicode字符。
那個
\€
char是“歐元”符號的unicode。 除非我使用urllib2 quote
方法,否則我基本上發現我遇到了問題。
編碼“原始”unicode的url實際上沒有意義。 你需要做的是.encode("utf8")
首先你有一個已知的字節編碼,然后是.quote()
。
輸出不是很漂亮,但應該是正確的uri編碼。
>>> s = u'1234567890-/:;()$&@".,?!\'[]{}#%^*+=_\|~<>\u20ac\xa3\xa5\u2022.,?!\''
>>> urllib2.quote(s.encode("utf8"))
'1234567890-/%3A%3B%28%29%24%26%40%22.%2C%3F%21%27%5B%5D%7B%7D%23%25%5E%2A%2B%3D_%5C%7C%7E%3C%3E%E2%82%AC%C2%A3%C2%A5%E2%80%A2.%2C%3F%21%27'
請記住,如果您正在調試或其他任何事情,您將需要unquote()
和decode()
來正確打印出來。
>>> print urllib2.unquote(urllib2.quote(s.encode("utf8")))
1234567890-/:;()$&@".,?!'[]{}#%^*+=_\|~<>€£¥•.,?!'
>>> # oops, nasty  means we've got a utf8 byte stream being treated as an ascii stream
>>> print urllib2.unquote(urllib2.quote(s.encode("utf8"))).decode("utf8")
1234567890-/:;()$&@".,?!'[]{}#%^*+=_\|~<>€£¥•.,?!'
事實上,這是另一個答案中提到的django函數所做的事情。
函數django.utils.http.urlquote()和django.utils.http.urlquote_plus()是Python的標准urllib.quote()和urllib.quote_plus()的版本,它們使用非ASCII字符。 (數據在編碼之前轉換為UTF-8。)
如果您使用任何進一步的引用或編碼不要破壞東西,請小心。
我想要第二次pycruft的評論。 網絡協議已經發展了數十年,處理各種慣例可能很麻煩。 現在URL恰好沒有為字符定義,只是為字節(八位字節)定義。 作為一個歷史巧合,URL是您只能假設但不強制執行或安全地期望編碼存在的地方之一。 然而,有一個慣例是喜歡latin-1和utf-8而不是其他編碼。 有一段時間,它看起來像' unicode percent escapes '將是未來,但它們從來沒有流行起來。
它是最重要的是在這方面的約之間的差迂腐挑剔unicode
對象和八位字節str
英格斯(在Python <3.0;這是,混淆性, str
Unicode對象和bytes
/ bytearray
在Python對象> = 3.0)。 不幸的是,根據我的經驗,出於多種原因很難將Python 2.x中的兩個概念完全分開。
甚至更多OT,當你想要接收第三方HTTP請求時,你不能完全依賴於以百分比轉義,utf-8編碼的八位字節發送的URL:偶爾會有%uxxxx
轉義,並且在那里至少firefox 2.x用於在可能的情況下將URL編碼為latin-1,並且僅在必要時將utf-8編碼為utf-8。
你運氣不好stdlib,urllib.quote不適用於unicode。 如果您正在使用django,您可以使用django.utils.http.urlquote,它可以正常使用unicode
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.