关于编解码
编码/解码本质上是一种映射
a
用ascii编码则是65,计算机中存储的就是 00110101
但是显示的时候不能显示 00110101,还是要显示’a’,计算机就需要解码
编码:真实字符与二进制串的对应关系,真实字符 → 二进制串
解码:二进制串与真实字符的对应关系,二进制串 → 真实字符
编码的种类
- ASCII 占1个字节,只支持英文
- GB2312 占2个字节,支持6700+汉字
- GBK GB2312的升级版,支持21000+汉字,中文2个字节。
- Unicode 2-4字节 已经收录136690个字符
- UTF-8: 使用1、2、3、4个字节表示所有字符;
优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个。中文3个字节。 - UTF-16: 使用2、4个字节表示所有字符;
优先使用2个字节,否则使用4个字节表示。
ASCII 以1字节8个bit位表示一个字符,首位全是0,表示的字符集明显不够
unicode编码系统是为表达任意语言而设计的,为了防止存储上的冗余(比如,对应ascii码的部分),其采用了变长编码,但变长编码给解码带来了困难,无法判断是几个字节表示一个字符
UTF-8是针对unicode变长编码设计的一种前缀吗,根据前缀可判断是几个字节表示一个字符
Python2 中默认是ASCII码
Python3 中默认是unicode
UTF-8 --> decode 解码 --> Unicode
Unicode --> encode 编码 --> GBK / UTF-8 等
if __name__ == '__main__':
str = '你好' # b'\xe4\xbd\xa0\xe5\xa5\xbd' gbk:b'\xc4\xe3\xba\xc3'
str = 'abc' # b'abc'
str = 'นั่ง' # b'\xe0\xb8\x99\xe0\xb8\xb1\xe0\xb9\x88\xe0\xb8\x87'
str = 'นั่' # b'\xe0\xb8\x99\xe0\xb8\xb1\xe0\xb9\x88'
# str = 2 # 'int' object has no attribute 'encode'
str = '*' # b'*'
a = str.encode('UTF-8')
a = str.encode('gbk')
print(a)
print(type(a)) # <class 'bytes'>