目录
一、二进制
1.1 二进制基本介绍
二进制即只有0和1,逢二进一
1位二进制数据总共可表示种状态,即0和1
2位二进制数据总共可表示种状态,即00,01,10,11
以此类推,n位二进制可以表示中状态,特别的,8位二进制数据可以表示种状态,对应十进制数字0~255
1.2 二进制与10进制转换
相较于用公式算,直接记住二进制每一位下的“1”对应10进制的数字大小(即位权)能更快的计算
1.3 二进制与16进制转换
通过10进制过渡,一步步计算
11010 = 1 1010 = 1 (8+2) = 1 10 = 1 A=1A
每四位二进制数据对应一位十六进制数据,结合每位的位权,快速得出对应16进制关系
二、bite及byte
bit:计算机里用来存放1或0的最小存储单位(百兆宽带是用bit作单位的)
byte:字节,计算机最常用的由8个bit构成的存储单位(下载速度中KB,MB中的B指的就是byte)
三、编码表
3.1 编码及编码表定义
编码:本质就是让只认识0和1的计算机,能够认识人类使用的语言符号,并且将数据转化为二进制进行存储和传输
编码表:人类语言和二进制数据的对应关系
乱码的本质:解码器使用的编码表与编码器使用的编码表不一致导致混乱
3.2 ASCII编码
美国发明的,适用于英文,英文字母+数字+常用符号总共也就100来个,使用7个bit位足够了,所以一个字节中会剩下一个bit位,默认为0
问题:只适用于英语,不适用于其他语言,尤其不适合中文,256位完全不够用
3.3 GB2312
中国出台的,用2个字节,代表65535个常用汉字,升级版是GBK码
3.4 Unicode万国码
将世界上所有的符号都收集纳入,可容纳100多万个符号。Unicode编码点分为17个平面(plane),每个平面包含216(即65536)个码位(code point)。17个平面的码位可表示为从U+xx0000到U+xxFFFF,其中xx表示十六进制值从到,共计17个平面,总计17×65536=1114112个码位。
17个平面中,第一个平面称为“基本多语言平面”(Basic Multilingual Plane,简称BMP),其余平面称为“辅助平面”(Supplementary Planes)。其中“基本多语言平面”(0~0xFFFF)中0xD800~0xDFFF之间的码位作为保留,未使用。
缺点是为迁就一些占用字节比较多的语言(比如中文),英文也要跟着占两个字节。比如要存储A,原本00010001就可以了,使用万国码就必须用两个字节:00000000 00010001,极大的浪费计算机存储空间。
3.5 UTF-8
一种针对Unicode的可变长度字符编码,可使用1~4个字节表示一个符号,根据符号选择字节长度,可兼容ACSII编码
UTF-8的编码规则:
(1) 对于ASCII码中的符号,使用单字节编码,其编码值与ASCII值相同。其中ASCII值的范围为0~0x7F,所有编码的二进制值中第一位为0(这个正好可以用来区分单字节编码和多字节编码)。
(2) 其它字符用多个字节来编码(假设用N个字节),多字节编码需满足:第一个字节的前N位都为1,第N+1位为0,后面N-1 个字节的前两位都为10,这N个字节中其余位全部用来存储Unicode中的码位值。
字节数 | Unicode | UTF-8编码 |
---|---|---|
1 | 000000-00007F | 0xxxxxxx |
2 | 000080-0007FF | 110xxxxx 10xxxxxx |
3 | 000800-00FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
4 | 010000-10FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
3.6 几种编码表的使用情况
计算机是有自己的工作区的,这个工作区被称为“内存”。数据在内存当中处理时,使用的格式是Unicode,统一标准。
数据在硬盘上存储,或者是在网络上传输时,用的是UTF-8,因为节省空间。但你不必操心如何转换UTF-8和Unicode,当我们点击保存的时候,程序已经“默默地”帮我们做好了编码工作。
一些中文的文件和中文网站,还在使用GBK,和GB2312。
四、编码与解码
encode()与decode()函数
编码,即将人类语言转换为计算机语言,就是【编码】encode();反之,就是【解码】decode()
print('吴枫'.encode('utf-8')) #将吴枫’按照utf-8格式编码
print('吴枫'.encode('gbk')) #将‘吴枫’按照gbk格式编码
print(b'\xe5\x90\xb4\xe6\x9e\xab'.decode('utf-8')) #将‘\xe5\x90\xb4\xe6\x9e\xab’按照utf-8格式解码
print(b'\xce\xe2\xb7\xe3'.decode('gbk')) #将‘\xce\xe2\xb7\xe3’按照gbk格式解码
将人类语言编码后得到的结果,有一个相同之处,就是最前面都有一个字母b,比如b'\xce\xe2\xb7\xe3',这代表它是bytes(字节)类型的数据。
print(type('吴枫'))
print(type(b'\xce\xe2\xb7\xe3'))
<class 'str'>
<class 'bytes'>