同福

Python实现URL编码、Base64编码、MD5编码的方法【20210428】

介绍

介绍

今天开始福哥要给大家讲解关于字符编码的知识,所谓字符编码就是将一个字符串或者是一个二进制字节数组里面的每一个字符根据一定的规则替换成一个或者多个其他字符的过程。

字符编码的意义有很多种,有的是为了将一些不可见的字符以可见字符替代保证可见度;有的是为了以少数字符去描述更多的其他字符便于传递数据;还有的是为了将不定长的字符串转成定长的规则字符串来实现字符串加密的目的。

编码

编码,英文是Encode,意思是从一个原始的字符串根据编码规则转换成一段新的字符串的过程。

编码后的字符串里面的字符会更加统一,或者更加单一,甚至会变成固定长度。

解码

解码,英文是Decode,和编码正好相反,意思是从一段已经编码后的字符串还原成编码前的原始字符串的过程。

并不是所有的经过编码规则进行编码后的字符串都可以解码会原始字符串的,能够解码回来的编码方式称之为可逆编码方式,不能够解码回来的编码方式称之为不可逆编码方式

URL

URL编码规则是这样的,首先按顺序取出字符串当中的每一个字符,将字符转换为ASCII码的十六进制数值,然后在十六进制数值前面加上一个百分号“%”,最后把每一个字符编码后的组合拼接起来就完成了。而解码规则就是反过来,将编码后的字符串以百分号“%”拆分开,然后将每个十六进制数值转换回ASCII码,最后在拼接到一起就好了。

需要注意的GBK的字符串和UTF-8的字符串在进行URL编码后得到的字符串是不一样的,例如:GBK的“福哥”编码后是“%B8%A3%B8%E7”,而UTF-8的“福哥”编码后是“%E7%A6%8F%E5%93%A5”。

编码

Python是使用urllib库的urlencode方法来实现URL编码的,但是有个别扭的地方是这个方法不能传递字符串参数,真是有够恶心的。

import urllib

str = "福哥说:Python的URL编码/解码有的恶心"
strEncoded = urllib.urlencode(str)

print(strEncoded)

home/topic/2021/0428/22/59cb5b46c53db85ec4837e6b8b2b82d6.jpg

这里只能传入字典类型的数据,第2个参数表示是否要将数组项拆分成多个同名的元素,福哥推荐设置为True,因为它更加符合通过表单提交时候的效果。

dataOrg = {
    "str": "福哥说:Python的URL编码/解码有的恶心",
    "abilities": ["PHP", "Python", "Java", "JavaScript", "Asp.net"]
}
dataEncoded = urllib.urlencode(dataOrg, True)

print(dataEncoded)

home/topic/2021/0428/22/e500cc50745f077a81d37cb0c6278495.jpg

解码

Python使用urllib库的unquote方法实现URL解码,这个命名福哥也是醉了,怪不得一般人猜不到呢。使用unquote而不是urldecode是要提醒编程者,我们不能将一串经过URL编码后的字符串转换回传入的字典结构,我们只能把字符串里面的URL编码转换成十进制码。

import urllib

dataEncoded = "abilities=PHP&abilities=Python&abilities=Java&abilities=JavaScript&abilities=Asp.net&str=%B8%A3%B8%E7%CB%B5%A3%BAPython%B5%C4URL%B1%E0%C2%EB%2F%BD%E2%C2%EB%D3%D0%B5%C4%B6%F1%D0%C4"
dataOrg = urllib.unquote(dataEncoded)

print(dataOrg)

home/topic/2021/0428/22/c654cf449dc69b4ccf3beaf04b1e1a94.jpg

Base64

Base64编码就是基于64个可见字符将任何十进制字符或者二进制字节转换成这些字符的过程,64个字符包括大小写字母和十个数字以及“+”和“/”,通常情况下“=”用来放在最后补位使用。

Base64编码方式同样受GBK或者UTF-8的影响,GBK的“福哥”的Base64码是“uKO45w==”,而UTF-8的“福哥”的Base64码是“56aP5ZOl”。

编码

Python使用base64库的encodestring方法实现Base64解码,使用也非常简单,传入原始字符串,返回编码后的字符串。

import base64

dataOrg = "福哥说:Python的Base64编码/解码非常好用"
dataEncoded = base64.encodestring(dataOrg)

print(dataEncoded)

home/topic/2021/0428/22/fabccecf12e731959090c56ac5456791.jpg

解码

Python使用base64库的decodestring方法实现Base64解码,使用也很简单,传入编码后的字符串,返回原始字符串。

import base64

dataEncoded = "uKO458u1o7pQeXRob261xEJhc2U2NLHgwusvveLC67fHs6O6w9PD"
dataOrg = base64.decodestring(dataEncoded)

print(dataOrg)

home/topic/2021/0428/22/bebea64555e8d05a5ac78ffef5d8f377.jpg

MD5

MD5是一种不可逆的编码,它采用摘要信息拼凑的方式可以将任意长度的十进制字符串或者二进制字节转换成固定32位长度的只包含小写字母的字符串。

通常情况下,MD5编码用来实现大数据的比较使用,MD5编码方式同样受GBK或者UTF-8的影响,GBK的“福哥”的MD5码是“d5c74952687fa8c993147a6f7b7ff12a”,而UTF-8的“福哥”的MD5码是“acc08377677515492df02556cf415f63”。

编码

Python的MD5编码是依靠hashlib库来实现的,调用起来稍微有一点麻烦,学过Java童鞋看起来会比较亲切。

import hashlib

dataOrg = "福哥说:Python的MD5编码语法有的复杂"
dataEncoded = hashlib.md5(dataOrg).hexdigest()

print(dataEncoded)

home/topic/2021/0428/22/7dd3ea0a49d479033fcccc38a9adba8a.jpg

总结

今天福哥带着童鞋们了解了关于URL编码、Base64编码和MD5编码的知识,学会了在Python语言当中使用这三种编码方式的技巧,一般情况下,学会这三种编码方式就足以应付绝大多数的场景下的数据编码的需要了。

下一课福哥将介绍在Java语言里面实现这三种编码方式的技巧,敬请期待~