八进制

    使用0、1、2、3、4、5、6、7组成的

    十六进制

    使用0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f组成的

    ASCII编码表中的“K”

    注意这里还是大写的字母K哦~

    存储单位

    计算机里的存储单位

    位/比特(bit)

    位:又叫比特(bit)是计算机里最小的存储单位。用来存放一位二进制书,即0或1。

    字节(byte)

    八个比特是一个字节,是计算机里最常用的单位。简写“B”

    千字节(Kilobyte)

    兆字节(Megabyte)

    简称“兆”

    吉字节(Gigabyte)

    又叫千兆

    单位换算

    1B(byte 字节) = 8bit
    1KB(Kilobyte 千字节) = 1024B
    1MB(Megabyte 兆字节) = 1024KB
    1GB(Gigabyte) = 1024MB

    为什么办的100兆的宽带,撑死就只有10几兆的下载速度?

    因为运营商的带宽是以比特每秒为单位的,比如100M就是100Mbit/s。

    而我们常看到的下载速度KB却是以字节每秒为单位显示的,1byte = 8bit,所以运营商说的带宽得先除以8,你的百兆宽带下载速度,也就是十几兆了。

    编码表

    为了避免乱码,人类就约定了一套共同的编码规则。就像计算机世界的新华字典、牛津英语字典。

    编码表历史

    ASCII

    ASCII统一了前面0-127位,但从状态128到255这一段的解释就完全乱套了,比如135在法语,希伯来语,俄语编码中完全是不同的符号。

    GB2312和GBK

    Unicode

    因各个国家的编码表都不同。不同国家间通信又会乱码。

    万国码的缺点是让英文字符被迫占用两个字节,耗费计算机存储空间。(如A:用00010001就行,但是为了顺从统一,需要用两个字节:00000000 00010001)

    UTF-8

    Unicode与UTF-8这种暧昧的关系一言以蔽之:Unicode是内存编码的规范,而UTF-8是如何保存和传输Unicode的手段。

    编码表对比

    编码方案使用情况表

    基于上表,有时候面对不同编码的数据,我们还需要手动操作实现编码转换。就要用到encode(编码)decode(解码)

    编码操作和解码操作

    编码:encode()

    语法:

    '你想编码的内容'.encode('你使用的编码表名称')

    用法:

    print('一天打鱼两个月晒网的小石头'.encode('utf-8'))
    # b'\xe4\xb8\x80\xe5\xa4\xa9\xe6\x89\x93\xe9\xb1\xbc\xe4\xb8\xa4\xe4\xb8\xaa\xe6\x9c\x88\xe6\x99\x92\xe7\xbd\x91\xe7\x9a\x84\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4'
    print('I Love U'.encode('gbk'))
    # b'I Love U'
    print('小石头'.encode('utf-8'))
    # b'\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4'

    将上述人类语言编码得到机器语言后的打印结果在注释里。

    字母b

    这里之所以有个字母b,代表他是bytes(字节)类型的数据。可以用type()函数验证一下:

    print(type(b'\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4')) # <class 'bytes'>

    符号\x

    另外,几乎每个字母/数字前边都有的\x,他的作用是分隔符,用来分隔一个字节和另一个字节。

    这样的分隔符,我们还见过:

    <a href="https://www.baidu.com/s?wd=%e5%b0%8f%e7%9f%b3%e5%a4%b4" />

    对比发现下边两段字符串,你有发现什么奥妙么!:

    %e5%b0%8f%e7%9f%b3%e5%a4%b4
    \xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4
    

    %\x一样,都是一种分隔符。只不过%是url中的、\x是python中的

    解码:decode()

    语法:

    '你想解码的内容'.encode('你使用的编码表名称')

    用法:

    print(b'\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4'.decode('UTF-8')) # 小石头

    ::: warning 注意你要解码的内容得跟编码时用的编码表一致。不然会报错。:::

    也就是说,UTF-8编码的字节就一定要用UTF-8的规则解码,其他编码同理,否则就会出现乱码或者报错的情况,

    print(b'\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4'.decode('GBK'))
    # 把utf-8编码的字符串用GBK来解码,就报错了。
    # UnicodeDecodeError: 'gbk' codec can't decode byte 0xb4 in position 8: incomplete multibyte sequence
    05-31 10:54