首先来说,编码即是密码本,编码记录的就是二进制与文字之间的对应关系,现存的编码本有:
ASCII码:包含英文字母,数字,特殊字符与01010101对应关系:共127个字符,使用7位二
进制表示,扩展一位,共256个字符
a 01000001 一个字符一个字节表示。即八位二进制数
GBK: 只包含中国汉字以及英文,数字特殊字符与01010101对应关系:
a 01000001 ASCII码中的字:一个字符一个字节表示
中 01001001 01000010 中文:一个字符两个字节表示。
Unicode: 包含全世界所有的文字与二进制01010101的对应关系
a 01000001 01000001 01000001 01000001
中 01001001 01001001 01001001 01001001
UTF-8 包含全世界所有的文字与二进制01010001的对应关系(最少用8位一个字节表示一个字符)。
a 01000001 ASCII中的字符,一个字符一个字节表示
To 01000001 01000010 (欧洲文字:葡萄牙,西班牙等)一个字符两个字节表示
中 01001001 01000010 01100011 亚洲文字:一个字符三个字节表示
为防止转换出现乱码,数据在内存中全部是Unicode编码的,可以识别几乎全部的文字。
但是Unicode一个字符需要4个字节,占用空间大,当数据用于网络传输或者存储到硬盘
中,必须是非Unicode编码。
# python3X 以 str为例,模拟将一句话通过网络发给对方
# content就是那句话. 内存中的编码方式:Unicode。首先转化为非Unicode再传输和存储
# content = input(">>>")
# print(content)
# bytes , 属于字符串 表现形式:b"str"
# b = b"hello"
# print(b, type(b)) # b'hello' <class 'bytes'>
# b = b"中国"
# print(b, type(b)) # SyntaxError: bytes can only contain ASCII literal characters.
# str ---> bytes
s1 = "中国"
b1 = s1.encode("utf-8") # encode 编码
print(b1, type(b1)) # b'\xe4\xb8\xad\xe5\x9b\xbd' <class 'bytes'>. utf-8 三个字节一个汉字
# bytes --->str
b2 = b'\xe4\xb8\xad\xe5\x9b\xbd'
s2 = b2.decode("utf-8") # decode 解码
print(s2, type(s2))
# str ---> bytes
s3 = "中国"
b3 = s3.encode("GBK") # encode 编码
print(b3, type(b3)) # b'\xd6\xd0\xb9\xfa' <class 'bytes'>. 中文GBK两个字节一个汉字
# bytes --->str
b4 = b'\xd6\xd0\xb9\xfa'
s4 = b4.decode("GBK") # decode 解码
print(s4, type(s4))