Python的编码问题

布啦豆 6374

Python3 最重要的一项改进之一就是解决了 Python2 中字符串与字符编码遗留下来的这个大坑。港真,就这一点,安利Python3入门呐

首先介绍一下什么是编码

在人类社会,不同国家有不同的标准语法,简体汉语、繁体汉语、美式英语、英式英语等.....

但是机器保存数据是以一种特殊的方式来保存,读取的时候也是以同样的方式来解读。

在Python3当中,默认处理中文的方式叫UTF-8。【对比看伤害:UTF-8支持中文,Python2默认格式是ASCII,不支持中文】

同样的一个中文词语,例如:"中国",经过UFT-8方法转存到硬盘中,比如保存成了"110",再通过UFT-8方法读取,也是显示"中国";通过另一种方法转存到硬盘中,"中国"则会保存成"101",然后通过UTF-8读取,肯定不会显示成"中国",也许就是一个乱七八糟的乱码"烫烫烫烫烫烫烫烫烫";

虽然上面的110、119、烫烫烫是乱填的,下面示例代码中有具体值,总之一个:想要显示正常,读取数据时格式,必须和保存数据时一致

Python3的编码介绍

闲扯几句——Python2 字符串设计上的一些缺陷:

  • 使用ASCII 码作为默认编码方式,对中文处理很不友好。
  • 把字符串牵强地分为 unicode 和 str 两种类型,误导开发者

以上提及的两个问题,Python3都很好的解决了

  • 首先,Python3 把系统默认编码设置为 UTF-8
  • 然后,文本字符和二进制数据区分得更清晰,分别用 str 和 bytes 表示。

文本字符全部用 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()
'第一个字符串'

python3的字符串和二进制数据

当然,在做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解码就可以拿到正确汉字了

Python3的unicode和byte以及str

版权声明:允许转载,转载请注明出处 —— 《Python3教程》: Python的编码问题

Copyright @2016-2017 | 赣ICP备16003025号