如何在python中编码url

sam*_*sam 0 python url

我创建了一个解码url的函数.

from urllib import unquote

def unquote_u(source):
  result = source
  if '%u' in result:
    result = result.replace('%u','\\u').decode('unicode_escape')
  result = unquote(result)
  print result
  return result

if __name__=='__main__':
    unquote_u('{%22%22%3A%22test_%E5%93%A6%E4%BA%88%E4%BB%A5%E8%85%BF%E5%93%A6.doc.txt%22%2C%22mimeType%22%3A%22text%2Fplain%22%2C%22compressed%22%3Afalse%7D')
Run Code Online (Sandbox Code Playgroud)

但是,我不能得到正确的文件名.正确的文件名是:test_哦予以腿哦.doc

任何人都可以告诉我该怎么做?

jco*_*ctx 5

urllib.unquote可以做到:

>>> urllib.unquote('{%22%22%3A%22test_%E5%93%A6%E4%BA%88%E4%BB%A5%E8%85%BF%E5%93%A6.doc.txt%22%2C%22mimeType%22%3A%22text%2Fplain%22%2C%22compressed%22%3AFalse%7D')
'{"":"test_\xe5\x93\xa6\xe4\xba\x88\xe4\xbb\xa5\xe8\x85\xbf\xe5\x93\xa6.doc.txt","mimeType":"text/plain","compressed":False}'
>>> eval(_)
{'': 'test_\xe5\x93\xa6\xe4\xba\x88\xe4\xbb\xa5\xe8\x85\xbf\xe5\x93\xa6.doc.txt', 'mimeType': 'text/plain', 'compressed': False}
>>> _['']
'test_\xe5\x93\xa6\xe4\xba\x88\xe4\xbb\xa5\xe8\x85\xbf\xe5\x93\xa6.doc.txt'
>>> print _
test_?????.doc.txt
Run Code Online (Sandbox Code Playgroud)

请注意,我必须在引用的字符串中将"false"更改为"False".另外,unquote之后的字符串仍然是UTF-8编码的; 您可以使用str.decode('utf8')获取Unicode字符串,如果这是您需要的.


正如JBernardo所提到的,不安全数据的eval()是一个非常糟糕的主意.任何知道甚至怀疑服务器端脚本是eval()表单数据的人都可以使用可能危及服务器的命令轻松地创建POST.更好的是:

>>> import json, urllib
>>> json.loads(urllib.unquote('{%22%22%3A%22test_%E5%93%A6%E4%BA%88%E4%BB%A5%E8%85%BF%E5%93%A6.doc.txt%22%2C%22mimeType%22%3A%22text%2Fplain%22%2C%22compressed%22%3Afalse%7D'))['']
u'test_\u54e6\u4e88\u4ee5\u817f\u54e6.doc.txt'
>>> print _
test_?????.doc.txt
Run Code Online (Sandbox Code Playgroud)

另请注意,此后续方法不需要将false更改为False; 事实上,如果我这样做,它就不起作用.json包解决了这个问题.