我们在显示屏上看的字母a、b、c...
最终都会被转换成0/1
序列, 因为计算机只能识别0和1
。从数字
到字母
的转换都过程,计算机需要依赖于一个类似于字典
的东西,它是权威标准的,每一台计算机都要按照它都规定,最早诞生的字典,名为ASCII
。
一个字节(byte)
是8位的二进制0000 0000
,总共代表256
种状态。最初的计算机只流行于英语国家,英文的字母大小写总共是52
个,加上一些常用的符号
,数字
,这个字典的长度是128
位,所以ASCII占用一个字节。
【 ASCII对照表 】
后来,计算机发展到了世界各地,只表示英文和数字的ASCII
已经满足不了各国的需求,大家纷纷发展出自己语言的字典
,比如中国的GBK
。
这样很有问题,夹杂着各种语言的文档,经常会被解析出来一大堆 乱码
。为了统一,大家商议决定,制定一个通用的字典unicode
。
unicode
是在ASCII
的基础上扩展的,对原有ASCII
字符完全兼容。长度上从原来的0000 0000
,扩展到了0000 0000 0000 0000
,占用2个字节,可以容纳65535
个字符。
# ASCII 字母 A
0110 0001 # 十进制 = 97
# unicode 字母 A
0000 0000 0110 0001 # 十进制 = 97 | ASCII字符就在前面补8位的0
unicode
是一个字典,也叫字符集
,是信源编码
。而UTF-8
是信道编码
,我们数据在传输
的时候,都会被解析成UTF-8
。
UTF-8
是在unicode
的基础上,进行编码和解码,针对unicode
传输实现的编码还有UTF-16 / UTF-32
等...
UTF-8
是变长的,不同的文字有不同的长度,英文字母一般是1 byte
,汉字是3 byte
。
在Python3
之前的Python版本,使用的是ASCII
编码,所以对中文的支持很头,现在已经原生的支持unicode
。
# 正 unicode
>>> ord('a')
97
# 反 unicode
>>> chr(97)
'a'
# 中文
>>> ord('哦')
21734
# 编码
>>> 'a'.encode('utf-8')
b'a'
>>> '哦'.encode('utf-8')
b'\xe5\x93\xa6'
# 解码
>>> b'\xe5\x93\xa6'.decode('utf-8')
'哦'
二进制数据类型,1 byte
是8位的二进制0000 0000
。
>>> len('哦') # 1个字符
1
>>> len('哦'.encode('utf-8')) # 3个字节
3
# 以上是字节和字符的关系