Python3 最重要的一项改进之一就是解决了 Python2 中字符串与字符编码遗留下来的这个大坑。港真,就这一点,安利Python3入门呐
在人类社会,不同国家有不同的标准语法,简体汉语、繁体汉语、美式英语、英式英语等.....
但是机器保存数据是以一种特殊的方式来保存,读取的时候也是以同样的方式来解读。
在Python3当中,默认处理中文的方式叫UTF-8。【对比看伤害:UTF-8支持中文,Python2默认格式是ASCII,不支持中文】
同样的一个中文词语,例如:"中国",经过UFT-8方法转存到硬盘中,比如保存成了"110",再通过UFT-8方法读取,也是显示"中国";通过另一种方法转存到硬盘中,"中国"则会保存成"101",然后通过UTF-8读取,肯定不会显示成"中国",也许就是一个乱七八糟的乱码"烫烫烫烫烫烫烫烫烫";
虽然上面的110、119、烫烫烫是乱填的,下面示例代码中有具体值,总之一个:想要显示正常,读取数据时格式,必须和保存数据时一致
闲扯几句——Python2 字符串设计上的一些缺陷:
以上提及的两个问题,Python3都很好的解决了
文本字符全部用 str 类型表示,str 能表示 Unicode 字符集中所有字符,而二进制字节数据用一种全新的数据类型,用 bytes 来表示。
先定义str类型的字符串:
>>> one_str = "第一个字符串"
>>> one_str
'第一个字符串'
>>> type(one_str)
str
通过str字符串,拿到byte类型数据
>>> two_byte = one_str.encode()
>>> two_str
b'\xe7\xac\xac\xe4\xb8\x80\xe4\xb8\xaa\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2'
>>> type(two_str)
bytes
上面的one_str是字符串类型str,并通过编码函数encode(),得到二进制类型参数two_byte。
既然通过字符串通过编码得到了二进制数据,那二进制数据肯定可以通过解码的形式得到字符串
>>> two_byte.decode()
'第一个字符串'
当然,在做Python爬虫经过会遇到类似'\u4e2d\u56fd'的Unicode编码格式的数据,导致显示的不是中文
一般打印的都是str类型,这里提供个解析方法:
>>> decode_str = "\\u4e2d\\u56fd"
>>> decode_byte = decode_str.encode() #str只有编码函数,先编码
>>> decode_byte #打印byte类型变量的数据
b'\\u4e2d\\u56fd'
>>> decode_byte.decode('unicode-escape') #decode解码函数,按照unicode的数据方法解码
'中国'
在Python3版本当中,str类型只有encode编码函数,已经没有的decode解码函数,所以先变成byte类型,再使用decode解码函数。
上面的示例是str类型的字符串,如果"\\u4e2d\\u56fd"
是b"\\u4e2d\\u56fd"
byte类型,则可以省去decode_byte = decode_str.encode()
这句语句,直接decode解码就可以拿到正确汉字了