编码的本质
用于描述文字与二进制的对应关系
非Unicode的编码直接不能互相识别
编码的发展
ASCII
-
最早的编码
-
一个字节表示字母☛数字☛字符
-
128个
-
最高位 为 0
- 留下备用
-
gbk
- 国标码
- 兼容 ASCII
- 两个字节表示汉字
unicode
-
每个国家都有自己的编码
-
一套统一的编码
-
兼容所有编码方式
-
一个字符用4个字节表示
- 浪费空间
-
python中所有的数据都是Unicode编码存在
- 除去 bytes 类型
-
计算机内存采用Unicode编码方式
-
核心地位的编码
utf-8
-
从Unicode升级过来的
-
一个字节表示英文
-
两个字节表示欧洲文字
-
三个字节表示汉字
- 汉字有9万多个
- 日本文字有12万多个
编码
Unicode编码
- 内存里面的表示方式
非Unicode编码
- 硬盘内容的存储
- 网络传输
strきbytes
str
-
编码方式Unicode
-
字符串
- 单位☛字符
bytes
-
编码方式→非Unicode
-
字节流
- 单位☛字节
编码☛解码问题
有编码才需要解码
编码方式和解码方式不一致会报错
- UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xbb in position 1: invalid start byte
Unicode转为非Unicode,叫做编码
-
s = ‘中国’
-
s.encode(’utf-8‘)
- unicode编码的字符串, 转为 utf-8的字节流
-
结果
- s = b’\xe4\xb8\xad\xe5\x9b\xbd’
非Unicode转为Unicode,叫做解码
-
s = b’\xe4\xb8\xad\xe5\x9b\xbd’
-
s.decode(‘utf-8’)
- utf-8的字节流☛Unicode的字符串
-
结果
- s = ’中国‘
gbk与utf-8编码的转换
字节流表示
-
原文
- s0 = ‘a黄宏辉’
-
gbk
- s1 = b’a\xbb\xc6\xba\xea\xbb\xd4’
-
utf-8
- s2 = b’a\xe9\xbb\x84\xe5\xae\x8f\xe8\xbe\x89’