计算机采用 8 bit(比特,计算机最小表示单位) = 1 byte(字节,计算机最小存储单位),一个字节能表示的最大的整数就是 255(二进制11111111 = 十进制255),如果要表示更大的整数,就必须用更多的字节,比如两个字节可以表示的最大整数是 65535 。
ASCII (8位)编码包括大小写英文字母、数字和特殊字符,总共256(255+数字0,一共256)个。
中文编码格式的发展历程是在 ASCII 的基础之上经历了 GB2312(7K+)、GBK1.0(2W+)和 GB18030(27W+)。
Unicode (16位)把所有语言都统一到一套编码里,解决了乱码的问题,但造成了存储空间和网络传输的浪费,因此 Unicode 转化成了可变长编码的 UTF-8 编码。Python3 源码文件默认使用 UTF-8 编码,可以正常解析中文,无需指定 UTF-8 编码。
ASCII编码 | GBK编码 | Unicode编码 | UTF-8编码 | |
---|---|---|---|---|
英文 | 1btye | 1btye | 2byte | 1byte |
中文 | N/A | 2byte | 2byte | 3byte |
Python2 中默认的编码格式是 ASCII,因此需要指定字符编码才能支持中文。字符串默认也是 ASCII ,如果代码文件头声明了其它编码格式(如 GBK),那字符串就使用声明的编码格式,在内存中不会自动转成 Unicode。
Python3 中默认的编码格式是 UTF-8。字符串的编码格式是 Unicode,即使代码文件头声明了其它编码格式,在内存中也会转换为 Unicode。
Windows 系统中文版默认编码是 GBK,Linux 系统默认编码是 UTF-8。
# Python2指明编码格式:
# -*- coding:utf-8 -*-
计算机系统通用的字符编码工作方式:
在计算机内存中,统一使用 Unicode 编码,当需要保存到硬盘或者需要网络传输的时候,就转换为 UTF-8 编码。无论以什么编码在内存中显示字符,最终保存到硬盘上都是二进制(不同编码转成的二进制不同)。存储和读取的编码必须都要保持一致。
ASCII 转二进制的过程
把字符串拆分成单个字符,对照 ASCII 表把单个字符转成十进制,再把十进制转成二进制,每个字符最终转换成二进制后都是由 8 位的规则来组成的,不足 8 位的在二进制的左边补零从而成 8 位。
ASCII转二进制 | ||
ASCII码 | 十进制 | 二进制 |
Python | 80 121 116 104 111 110 | 01010000 01111001 01110100 01101000 01101111 01101110 |
可以使用 ord() 和 bin() 函数进行验证
# 字符对应的十进制整数
>>> ord('P')
80
>>> ord('y')
121
>>> ord('t')
116
>>> ord('h')
104
>>> ord('o')
111
>>> ord('n')
110
#十进制整数对应的二进制
>>> bin(80)
'0b1010000'
>>> bin(121)
'0b1111001'
>>> bin(116)
'0b1110100'
>>> bin(104)
'0b1101000'
>>> bin(111)
'0b1101111'
>>> bin(110)
'0b1101110'