八、编码的初识和进阶
-
ASCII码:只包含:英文字母,数字,特殊字符。
0000 0001 : a
0000 0101 : b
8bit (位)== 1byte(字节)
'hello123': 8byte
-
gbk: 英文字母,数字,特殊字符和中文。国标
一个英文字母: 0000 0001 : a 1字节
一个中文 中: 0000 0001 0100 0001 : 中 2字节
-
Unicode: 万国码:把世界上所有的文字都记录到这个密码本。
起初一个字符用2个字节表示:
0000 0001 0000 0011: a 2字节
0000 0001 0100 0001 : 中 2字节
后来为了涵盖全部文字:
0000 0001 0000 0011 0000 0001 0000 0011: a 4字节
0000 0001 0100 0001 0000 0001 0000 0011: 中 4字节
浪费空间,浪费资源。
-
Utf-8:升级:最少用8bit1个字节表示一个字符。
0000 0011 a 1字节
0000 0011 0000 0011 欧洲 2个字节
0000 0011 0000 0011 0000 0011 中: 3个字节
'中国12he' : GBK: 8个字节
'中国12he' : UTF-8: 10个字节
8bit = 1byte
1024byte = 1KB
1024KB = 1MB
1024MB = 1GB
1024GB = 1TB
1024TB = 1PB
1024TB = 1EB
1024EB = 1ZB
1024ZB = 1YB
1024YB = 1NB
1024NB = 1DB
比如:7.6MB ----> 7.6 * 1024 * 1024 * 8 bits
8bit (位)= 1byte(字节) 即1个字节=8个位
-
-
数据在内存中全部是以Unicode编码的,但是当你的数据用于网络传输或者存储到硬盘中必须是以非Unicode编码(utf-8,gbk等等)
-
bytes
-
英文:
str: 'hello '
内存中的编码方式: Unicode
表现形式: 'hello'
bytes :
内存中的编码方式: 非Unicode
表现形式:b'hello'
-
中文:
str:
内存中的编码方式: Unicode
表现形式:'中国'
bytes :
内存中的编码方式: 非Unicode # Utf-8
表现形式:b'\xe4\xb8\xad\xe5\x9b\xbd'
-
str ---> bytes 编码
s1.encode('utf-8')
s1.encode('gbk')
#str ---> bytes
s1 = '中国'
b1 = s1.encode('utf-8') # 编码
print(b1,type(b1))
# b'\xe4\xb8\xad\xe5\x9b\xbd'
b1 = s1.encode('gbk') # 编码
# b'\xd6\xd0\xb9\xfa' <class 'bytes'> -
bytes ---> str 解码
(用什么编码编过去的,就是用什么编码解回来,否则报错)
b1.decode('utf-8')
b1 = b'\xe4\xb8\xad\xe5\x9b\xbd'
s2 = b1.decode('utf-8') # 解码
print(s2)
#中国 -
gbk---> utf-8
先把gbk转化为Unicode,然后由Unicode转化为utf-8
# gbk ---> utf-8
b1 = b'\xd6\xd0\xb9\xfa'
s = b1.decode('gbk')
# print(s) #中国(Unicode)
b2 = s.encode('utf-8')
print(b2) # b'\xe4\xb8\xad\xe5\x9b\xbd'
-