Python 字符编码

Python3 的系统默认编码是 UTF-8,其中:

  • 文本字符全部用 str 表示(包括 Unicode 字符集中所有字符)
  • 二进制字节数据用 bytes 表示(可以是 ASCII 范围内的字符和其它十六进制形式的字符)

在字符引号前加 ‘b’,明确表示这是一个 bytes 类型的对象。

Python2 与 Python3 字节与字符的对应关系:

Python2 Python3 表现 转换 作用
str bytes 字节 encode 存储、网络传输
unicode str 字符 decode 显示

strbytes 之间的转换可以用 encodedecode 方法:

encode 负责字符到字节的编码转换,默认转换为 UTF-8 编码:

1
2
3
4
5
6
7
8
9
10
11
>>> s = "Python之禅"
>>> s.encode()
b'Python\xe4\xb9\x8b\xe7\xa6\x85'
>>> s.encode('gbk')
b'Python\xd6\xae\xec\xf8'
>>> s.encode('utf-8')
b'Python\xe4\xb9\x8b\xe7\xa6\x85'

>>> s = "Python"
>>> s.encode('ascii')
b'Python'

decode 负责字节到字符的解码转换,默认使用 UTF-8 编码格式进行转换:

1
2
3
4
>>> b'Python\xe4\xb9\x8b\xe7\xa6\x85'.decode()
'Python之禅'
>>> b'Python\xd6\xae\xec\xf8'.decode('gbk')
'Python之禅'

ASCII、Unicode、UTF-8 区别:

  • ASCII 使用 1 个字节,将最高位置为 0,后七位从 0 到 127 分别对每一个符号编码,能表示的字符十分有限;
  • 由于很多符号 ASCII 没办法表示,各国又在 ASCII 的基础上创建了适合自己语言的符号编码表,比如欧洲的 ISO,中国 GBK ……一时间天下大乱;
  • 为了解决编码混乱的问题,Unicode 收纳了全世界大部分的字符,从 0 一直编到了 100 多万,每一个区间都对应着一种语言的编码,所有的字符都有了唯一的编号;
  • 但是 Unicode 没有对字符编号的二进制编解码做出规定,因此就出现了 UTF-8,UTF-16,UTF-32 这些编码方案。其中 UTF-16 使用 2 个字节来编码所有的字符,UTF-32 则选择用 4 个字节来编码,而使用最多的就是 UTF-8 编码方案;
  • UTF-8 为了节省资源,采用变长编码,把一个 Unicode 字符根据不同字符内容编码成 1-6 个字节,可以显示中文(3 字节),同时兼容 ASCII 编码。

简单来说,Unicode 是 字符集,UTF-8 是 编码规则