url 编解码在Python的实现

原文

https://blog.csdn.net/wf592523813/article/details/79141463

URL 需编码&解码原因

通常如果一样东西需要编码,说明其并不适合直接传输。原因多种多样,如 size 过大,包含隐私数据。对于 url 来说,之所以要进行编码,是因为 url 中有些字符会引起歧义。

例如,url 参数字符串中使用 key=value 键值对这样的形式来传参,键值对之间以 & 符号分隔,如 /s?q=abc&ie=utf-8。如果你的value字符串中包含了= 或者 & ,那么势必会造成接收 url 的服务器解析错误,因此必须将引起歧义的 & 和 = 符号进行转义,也就是对其进行编码。

字符串被当作 url 提交时会被自动进行 url 编码处理,在 python 里也有个 urllib.urlencode 的方法,可以很方便的把字典形式的参数进行 url编码。当 url 地址含有中文或者 ‘/’ 的时候,这是就需要用做 urlencode一下编码转换。

关于 urlencode 和 quote

urlencode 的参数是词典,它可以将 key-value 这样的键值对转换成我们想要的格式,将URL中的键值对以连接符 & 划分。如果你用的是python2.*,urlencode 在 urllib.urlencode。如果使用的是 python3,urlencode在urllib.parse.urlencode。
在这里插入图片描述
如果只是相对一个字符串进行 urlencode 转换,使用 urllib 提供的另外一个函数:quote() : 在这里插入图片描述
对 url 进行解码,把类似 “%xx” 的字符替换成单个字符,当 urlencode之后的字符串传递过来之后,接收完毕解码使用 urllib 提供的unquote() 函数,注意没有 urldecode()!若 unquote方法接收到的参数类型是 unicode,则返回的值类型也是 unicode,只不过是把 “%” 替换成了 ’\x’,明智的做法是使用 str() 转换一下再用。
在这里插入图片描述
在做解码的时候,看 unquote() 这个函数的输出,是对应中文在 gbk 下的编码,在对比一下 quote() 的结果不难发现,**所谓的解码就是把字符串转成 gbk 编码,然后把 \x 替换成 %。**如果你的终端是 utf8 编码的,那么要把结果再转成 utf8 输出,否则就乱码。
可以根据实际情况,自定义或者重写 urlencode()、urldecode() 等函数。

注意事项

注意:如果是已经获得了 unicode 类型的字符串,字符串内容是,quote 过的,带百分号% 的,比如:
%E8%BD%AC%E5%8F%91%E5%BE%AE%E5%8D%9A

而此处,想要获得对应的中文内容,则需要先去把当前的unicode字符串转换为普通的 str

quotedStringStrType= str(quotedStringUnicodeType)

再去通过urllib.unquote去解码,得到真正的中文内容

urlunquotedOriginalStr = urllib.unquote(quotedStringStrType)

此处的最终解码得到的字符串是 UTF-8 编码的。

后记

更新时间: 2020-04-11

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章