繁体   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