url编码“原始” unicode确实没有任何意义。 首先,您需要做的是unquote(),这样您就有一个已知的字节编码,然后再进行decode()。

输出不是很漂亮,但是应该是正确的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 编码。)

如果要应用其他任何引号或编码,请不要打乱。