Python3 最重要的新特性大概要算是对文本(text)和二进制数据(binary data)作了更为清晰的区分。(详见参考 Python document)
文本总是 Unicode,由 str 类型表示。
二进制数据则由 bytes 类型表示。
那么什么是 bytes、什么是 Unicode 呢?(参考资料 知乎以及SO)
首先计算机能存储的唯一东西就是 bytes。所以为了在计算机中存储东西,我们首先得将其编码(encode),例如将其转化为 bytes。比如:
要想保存音乐,我们首先得用 MP3, WAV 等将其编码
要想保存图片,我们首先得用 PNG, JPEG 等将其编码
要想保存文本,我们首先得用 ASCII, UTF-8 等将其编码
Unicode 是字符集,不是字符编码。Unicode 把全世界的字符都搜集并且编号了,但是没有规定具体的编码规则。编码规则有 UTF-8、GBK 之类的。
Python3 不会以任意隐式的方式混用 str 和 bytes。正是这使得两者的区分特别清晰,你不能拼接字符串和字节包,也无法在字节包里搜索字符串(反之亦然),也不能将字符串传入参数为字节包的函数(反之亦然)。
将 string 转化成 bytes 首先需要进行编码(encode),而 encode 是可以使用许多不同的 encodings 的(参考资料 Standard Encodings)。而将 bytes 转化成 string 需要进行解码(decode),解码的 encodings 往往需要根据数据的实际编码情况来设定。