簡體   English   中英

使用Python進行URL編碼/解碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM