编码初识
计算机是需要存储数据和通过网络传输数据的,计算机存储在磁盘中的数据或者通过网络发送的数据本质发送的都是bit流也就是所谓的01010101101,那么这些010010是需要与咱们熟知的文字有标准的对应关系,这样咱们才可以识别这些数据。
ASCII码
ASCII码是基于拉丁字母的一套电脑编码系统ASCII码中只包含英文字母,数字以及特殊字符与二进制的对应关系,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号
简单记忆:
数字0-9:48~57
A-Z:65~90
a-z:97~122
(具体搜ASCII码表)
随着计算机的发展. 以及普及率的提高. 流⾏到欧洲和亚洲. 这时ASCII码就不合适了. 比如: 中⽂汉字有几万个. 而ASCII 多也就256个位置. 所以ASCII不行了;这时, 不同的国家就提出了不同的编码用来适用于各自的语言环境(每个国家都有每个国家的GBK,每个国家的GBK都只包含ASCII码中内容以及本国自己的文字). 比如, 中国的GBK, GB2312, BIG5, ISO-8859-1等等. 这时各个国家都可以使用计算机了
GBK
GBK:只包含本国文字(以及英文字母,数字,特殊字符)与0101010对应关系;经实际测试和查阅文档,GBK是采用单双字节变长编码,英文使用单字节编码,完全兼容ASCII字符编码,中文部分采用双字节编码
但是GBK只包含中文,不能包含其他文字,言外之意,GBK编码是不能识别其他国家的文字的,随着全球化的普及,由于网络的连通,以及互联网产品的共用(不同国家的游戏,软件,建立联系等),各个国家都需要产生各种交集,此时急需一个密码本:要包含全世界所有的文字与二进制0101010的对应关系,所以创建了万国码(Unicode)
Unicode
Unicode:(通用字符集)是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的标准字符集,包含全世界所有的文字与二进制0101001的对应关系,UCS-2用两个字节编码,UCS-4用4个字节编码。
起初,Unicode规定一个字符用两个字节表示;但是这种也不行,这种最多有65535种可能,可是中国文字有9万多,所以改成一个字符用四个字节表示,这样虽然解决了问题,但是又引出一个新的问题就是原本a可以用1个字节表示,却必须用4个字节,这样 非常浪费资源,所以对Uniocde进行升级
UTF-8
包含全世界所有的文字与二进制0101001的对应关系(最少用8位一个字节表示一个字符)
UTF-8是对Unicode编码的压缩与优化,将所有字符与符号分类:ASCII码中的内容用1个字节保存,欧洲的字符用2个字节保存,东亚字符用3个字节保存…
UTF-8 :最少用8位数,去表示一个字符.
英文: 8位,1个字节表示.
欧洲文字: 16位,两个字节表示.
中文,亚洲文字: 24位,三个字节表示.
单位转化
8bit = 1byte
1024byte = 1KB
1024KB = 1MB
1024MB = 1GB
1024GB = 1TB
1024TB = 1PB
1024TB = 1EB
1024EB = 1ZB
1024ZB = 1YB
1024YB = 1NB
1024NB = 1DB
编码进阶
-
不同的密码本(除Unicode外)之间不能相互识别
-
数据在内存中全部是以Unicode编码的,但是当数据用于网络传输或存储到硬盘中,必须是非Unicode编码(UTF-8、gbk等)
以字符串举例:
如果想将一个列表数据通过网络传输给另一个人,必须要把这个列表转化成一个特殊的字符串类型,然后才能传输过去,数据的存储也是一样
既然是字符串类型,那发送一句话也是字符串类型,就可以了?前面强调是“特殊的”字符串类型,我们一般说的字符串类型是str,其内部编码是Unicode,无法通过网络传输直接发,因此要转化为bytes(特殊的字符串)类型,内部编码是非Unicode,也就是说可以指定转化成的编码(gbk、utf-8等)
-
bytes类型也是Python的基础数据类型之一,bytes类型
bytes类型与字符串类型几乎一模一样,通过查看bytes的源码,bytes类型可用的操作方法与str相差无几
表现形式:
英文
str:‘Yuuka’
内部编码:Unicode
表现形式:‘Yuuka’
bytes:
内存中的编码方式:非Unicode
表现形式:b’Yuuka’
s1 = 'Yuuka' print(s1,type(s1)) # Yuuka <class 'str'> s2 = s1.encode('utf-8') print(s2,type(s2)) # b'Yuuka' <class 'bytes'>
中文
str:’优香‘
内部编码:Unicode
表现形式:‘优香’
bytes:
内存中的编码方式:非Unicode # UTF-8
表现形式:b’\xe4\xbc\x98\xe9\xa6\x99’
b = '优香'
print(b.encode('utf-8')) # b'\xe4\xbc\x98\xe9\xa6\x99'
str、bytes转化(Unicode、utf-8转化)
# str---->bytes
name = '优香'
b_name = name.encode('utf-8')
print(b_name) # b'\xe4\xbc\x98\xe9\xa6\x99'
# 取上面的bytes数据
# bytes---->str
ba_name = b'\xe4\xbc\x98\xe9\xa6\x99'
name = ba_name.decode('utf-8')
print(name) # 优香
str转bytes,用encode(编码)
bytes转str,用decode(解码)
gbk---->utf-8
所有的编码都与Unicode有关,utf-8能与Unicode相互转化,Unicode能与gbk相互转化,所以utf-8与gbk转化必须先转化为Unicode编码
# utf-8--->Unicode--->gbk
b = b'\xe4\xbc\x98\xe9\xa6\x99'
s1 = b.decode('utf')
print(s1) # 优香
s2 = s1.encode('gbk')
print(s2) # b'\xd3\xc5\xcf\xe3' # gbk编码
b是utf-8编码形式,需根据utf-8解码为Unicode,然后再对Unicode形式的码根据gbk进行编码
str | bytes |
---|---|
文字文本 | 字节文本 |
引号 | b加引号 |
Unicode | 非Unicode |
基础数据类型,用于存储少量的常用数据 | 负责以二进制字节序列形式记录需要记录的对象,至于对象表示什么,则由相应的编码格式决定;在Python3中,bytes通常用于网络数据传输、二进制图片和文件的保存等等 |
其他基本类型的编码转化,需要先转为str类型,再转化成bytes类型(暂时)