>>> import base64 >>> url = "https://www.baidu.com?a=23&b=中國" >>> b=base64.b64encode(url.decode('utf8').encode('utf-8')) >>> type(b) <type 'str'> >>> import sys >>> sys.getdefaultencoding() 'ascii'
>>> b=base64.b64encode(url.encode('utf-8')) Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 29: ordinal not in range(128)
對加密的str,編碼後,再使用base64加密,報錯。why?python
首先:ui
在python2中,字符串str默認採用的是ASCII編碼。編碼
所以在base64加密的時候,直接使用ascii的字符串str,加密便可。返回字符串str。加密
其次:url
在python2中,使用unicode類型做爲編碼的基礎類型。即spa
decode encodecode
str ---------> unicode --------->strblog
所以,若是要使用unicode,進行base64加密。utf-8
能夠有兩種方法,是正確的:ci
1).按照上面的步驟,先decode,再encode,這個時候字符串是默認的ascii。
>>> b=base64.b64encode(url.decode('utf8').encode('utf-8')) >>> type(b) <type 'str'>
2).將系統編碼設置爲utf8,直接encode()
>>> sys.getdefaultencoding() 'ascii' >>> reload(sys) <module 'sys' (built-in)> >>> sys.setdefaultencoding('utf8') >>> b=base64.b64encode(url.encode('utf-8')) >>> type(b) <type 'str'> >>> sys.getdefaultencoding() 'utf8'
>>> import base64 >>> url = "https://www.baidu.com?a=23&b=中國" >>> b=base64.b64encode(url.encode('utf-8')) >>> type(b) <class 'bytes'>
不然,拋出異常
>>> >>> b=base64.b64encode(url) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/base64.py", line 58, in b64encode encoded = binascii.b2a_base64(s, newline=False) TypeError: a bytes-like object is required, not 'str'
咱們能夠查看一下python3默認使用的編碼
>>> import sys >>> sys.getdefaultencoding() 'utf-8'
總結:
b=base64.b64encode(url.decode('utf-8').encode('utf-8'))
>>> b1=base64.b64decode(b) >>> type(b1) <type 'str'> >>> b1 'https://www.baidu.com?a=23&b=\xe4\xb8\xad\xe5\x9b\xbd' >>> sys.getdefaultencoding() 'utf8'
>>> b1=base64.b64decode(b) >>> type(b1) <type 'str'> >>> b1 'https://www.baidu.com?a=23&b=\xe4\xb8\xad\xe5\x9b\xbd' >>> sys.getdefaultencoding() 'ascii'
>>> b2=base64.b64decode(b).decode('utf8') >>> b2 u'https://www.baidu.com?a=23&b=\u4e2d\u56fd' >>> type(b2) <type 'unicode'> >>> sys.getdefaultencoding() 'utf8'
>>> b2=base64.b64decode(b).decode('utf8') >>> type(b2) <type 'unicode'> >>> b2 u'https://www.baidu.com?a=23&b=\u4e2d\u56fd' >>> sys.getdefaultencoding() 'ascii'
>>> b1=base64.b64decode(b) >>> type(b1) <class 'bytes'> >>> b2=base64.b64decode(b).decode() >>> type(b2) <class 'str'> >>> b1 b'https://www.baidu.com?a=23&b=\xe4\xb8\xad\xe5\x9b\xbd' >>> b2 'https://www.baidu.com?a=23&b=中國'