Python 字符编码

我们在显示屏上看的字母a、b、c...最终都会被转换成0/1序列, 因为计算机只能识别0和1。从数字字母的转换都过程,计算机需要依赖于一个类似于字典的东西,它是权威标准的,每一台计算机都要按照它都规定,最早诞生的字典,名为ASCII


ASCII

一个字节(byte)是8位的二进制0000 0000,总共代表256种状态。最初的计算机只流行于英语国家,英文的字母大小写总共是52个,加上一些常用的符号数字,这个字典的长度是128位,所以ASCII占用一个字节。

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

# 以上是字节和字符的关系
Python 教程 Python 入门 Python 时间 Python JSON