一、bytes简介
1. 字符集和编码
0 1 ==> 101010101 ==> 二进制转化成十进制 == > 88
电脑如何储存文字信息
10000 < == > a
最早统一标准:ascii 决定了每一个符号对应的二进制编码
ascii 编排了128个文字符号,只需要7个0和1就可以表示了,01111111 => 1 byte => 8 bit(位)
ANSI => 一套标准,规定每个字符 16bit,2byte => 最多存放65536个符号
eg:00000000 01111111
到china,形成gb2312编码,(扩充)gbk编码(windows默认是这个)
到taiwan,形成big5编码
到japan,形成JIS编码
但同一编码在不同国家可能对应不同字符,因此出现了
unicode:万国码。
早起unicode并没有意识到中国这么多的文字量。USC-2 2个字节
后续进行扩充,USC-4 4个字节(32bit,4byte)
======= ↓===========
utf:可变长度的unicode,可以进行数据的传输和存储 -> 行书、草书、隶书
utf-8:最短的字节长度8
英文:8bit,1byte
欧洲文字:16bit,2byte
中文:24bit,3byte
utf-16:最短的字节长度16
总结:
- ascii:8bit,1byte
- gbk:16bit,2byte(windows默认)
- unicode:32bit,4byte(没法用,只是一个标准)
- utf-8:(mac默认)
英文:8bit,1byte
欧洲文字:16bit,2byte
中文:24bit,3byte - gbk和utf-8不能直接就进行转化
我军密码本 -> 文字 -> 敌军密码本
2. 字节bytes
2.1 程序员平时遇见的所有的数据最终单位都是字节byte
举例:
s = "周杰伦"
bs1 = s.encode("gbk") # b'xxxx' bytes类型
bs2 = s.encode("utf-8")
print(bs1)
print(bs2)
print(type(bs1))
print(type(bs2))
返回结果:
2.2 字节转化
如何将一个gbk的字节转化成utf-8的字节?
先解码(变成文字符号(字符串)),再重新编码
举例:
bs = b'\xd6\xdc\xbd\xdc\xc2\xd7'
# 先变成文字符号(字符串)
s = bs.decode("gbk") # 解码
bs2 = s.encode("utf-8") # 重新编码
print(bs2)
总结:
操作 | 操作内容 |
---|---|
str.encode(“编码”) | 进行编码 |
bytes.decode(“编码”) | 进行解码 |
特殊现象:
s = "你好abc呵呵哒"
print(s.encode("utf-8"))
返回结果里abc字母返回就是其本身,符合sacii标准的东西到哪里都能显示
ascii:a:01100001
gbk:a:00000000 01100001
实际上gbk两个字节前面的没用啊,后面跟ascii一样