重点:
1.python3与python2不同,python3是默认采用utf-8编码的,因此当使用encode(),decode()这两个函数的时候,其实默认是使用了encode(“utf-8”),decode(“utf-8”)
2.encode()是相对于字符串使用的方法,只有字符串数据才可以使用encode(),返回的是一个bytes类型的Unicode编码
如:
s = "学习python"
>>> s_gbk = s.encode("gbk") #这里以gbk编码转为Unicode
>>> s_utf = s.encode("utf-8") #这里以utf-8编码转换为Unicode
>>> s_gbk
b'\xd1\xa7\xcf\xb0python' #这是一个bytes对象,前面加了个b
>>> s_utf
b'\xe5\xad\xa6\xe4\xb9\xa0python'#这是一个bytes对象,前面加了个b
>>>
3.decode是相对于bytes类型数据而言的,只有bytes类型数据才可以使用decode(),返回的是一个字符串
#原编码是什么方法内就应填入什么,否则转换会出现乱码
>>> s_gbk.decode("gbk")
'学习python'
>>> s_utf.decode("utf-8")
'学习python'
>>> s_utf.decode() #默认是转为utf-8,如果不指定的话
'学习python'
# 如果转换不对,就会出现乱码
>>> s_utf.decode("gbk")
'瀛︿範python'
>>> s_gbk.decode("utf-8")
'ѧϰpython'
>>>
>>>
4.了解以上规范后就清楚该如何处理乱码异常了:
a.出现看不懂的字符乱码,如“ ‘瀛︿範python’、‘ѧϰpython’”应该就是转码的时候使用了不同的编码格式造成的
b.当收到一个字符串为:s = "\xd1\xa7\xcf\xb0python "时,表示我们是需要转码才能看到中文。从编码上可以看出用的是gbk,但给的却是str类型,从上面的理解可知,我们先要将其转换为bytes类型数据,然后才能使用decode(“gbk”)输出。这里就要使用encode(“raw_unicode_escape”)这个方法了,可以将字符串原封不动的转为bytes类型。为什么不能用s.encode(“gbk”)直接转呢?因为gbk编码里面没有xd1,python识别不了就会报错!
>>> s = "\xd1\xa7\xcf\xb0python "
>>> s.encode("gbk") #直接使用encode("gbk") 是会报错的!
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'gbk' codec can't encode character '\xd1' in position 0: illegal multibyte sequence
>>> s.encode("raw_unicode_escape") #需要使用encode("raw_unicode_escape")
b'\xd1\xa7\xcf\xb0python '
>>> s.encode("raw_unicode_escape").decode("gbk") #转换为bytes后再使用decode("gbk")转为中文即可
'学习python '