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