来源:https://www.liaoxuefeng.com/wiki/1016959663602400/1017075323632896

简单来说,计算机处理文本需要先把文本转换为数字才能处理,通常8位一个字节。一个字节表达的最大的数是255,如果需要更大的数,就用2个字节表示,以此类推。

计算机是美国发明的,最早的编码表是ASCII表,只支持字母数字和部分符号,如果想显示中文的话,使用ASCII编码显然是乱码的,所以中国指定了GB2312编码,以此类推,日本也有日本的编码,韩国也有韩国的编码。

为了解决这个问题,Unicode编码出来了,通常用2个字节表示一个字符,生僻字通常是4个。后来本着节约精神,UTF-8编码出来了,这是一个可伸缩的编码。比如:'A'的编码是65,在ASCII中表示为01000001,而Unicode表示为 00000000 01000001,这样会有一个字节的浪费,所以UTF-8就是解决这个问题的,通常一个字节表示字母,汉字通常3个字符。

ord()可以获取编码数字,chr()函数可以通过数字获取原来的值
>>> ord("a")
97
>>> chr(97)
'a'

如果字符串需要在网络传输或保存到磁盘中,需要把字符串格式转换成byte格式
>>> '中文'.encode('utf-8') #表示用utf-8编码转换
b'\xe4\xb8\xad\xe6\x96\x87'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode()
'中文'

如果bytes中只有一小部分无效的字节,可以传入errors='ignore'忽略错误的字节:
>>> b'\xe4\xb8\xad\xe6aaa'.decode('utf-8', errors='ignore')
'中aaa'

len()函数表示字符串的字符数,表示byte类型的字节数
>>> len('中')
1
>>> '中'.encode('utf-8')
b'\xe4\xb8\xad'
>>> len(b'\xe4\xb8\xad')
3
>>>