python2字符串编码存在的问题:
- 使用 ASCII 码作为默认编码方式,对中文处理不友好
- 把字符串分为 unicode 和 str 两种类型,将unicode作为唯一内码,误导开发者
python3中默认编码方式修改为utf-8。
在存储和显示上,python3使用文本字符和二进制数据进行区分,更加明确和清晰。
文本字符使用str类型表示,str 能表示 Unicode 字符集中所有字符,而二进制数据使用bytes类型表示。
str与bytes之间的转换
一种方式
# bytes object
b = b"example"
# str object
s = "example"
# str to bytes
bytes(s, encoding = "utf8")
# bytes to str
str(b, encoding = "utf-8")
另一种方式,默认使用utf-8.
# bytes object
b = b"example"
# str object
s = "example"
# an alternative method
# str to bytes
str.encode(s)
# bytes to str
bytes.decode(b)
Python3中的编码
1.编码:
1.1 ASCII
一个字符占8位,
1.2 UTF-8
一个字符占8位
一个中文占24位
1.3 GBK
一个字符占8位
一个中文占16位
1.4 Unicode
1.4 只说Unicode的32位
一个字符占32位
一个中文字同样占32位
问题 : Unicode中的编码方式能否utf-8中的编码。 GBK的编码方式能否识别utf-8中的编码。
(1)各个编码之间的二进制是不能互相识别的,会产生乱码。
(2)传输或存储用的不是GBK就是UTF-8,或者其他的占用字节少的,unicode是不能用的,因为unicode占用32位,传输速率与流量消耗是极大的。GBK和UTF-8的转换需要借助于Unicode。
2. python3的字符串在内存中是unicode 32位编码方式。这样会产生的问题,一个文件传输过去后,对方不能直接用,因为是乱码的,所以必须要用UTF-8或GBK的方式进行转换存储传输,使用encode将str转换为bytes类型(将unicode转换为utf-8或gbk等),bytes类型可以是以utf-8或gbk或其他的编码进行编码存储的str。
2.1 bytes类型,一种数据类型。bytes类型的操作与字符串类似,与str的区别是编码方式不一样,str的编码是unicode,bytes的编码是gbk或utf-8的。所以想要存储或者传输一个字符串、文章等,必须将编码转换为gbk或utf-8或ascii或gbkgbk2312等(bytes是这样的编码方式),所以str想要传输和存储不能直接进行,需要转换成bytes类型在进行存储和传输。
对于英文:
str: 表现形式 s = 'alex',编码方式用的是unicode
bytes:s = b'alex',编码方式用的是utf-8、gbk等,但不是unicode
对于中文:
str:表现形式 s = '中国',编码方式是unicode
bytes:表现形式 s = b'xe4xb8xadxe5x9bxbd',编码方式是utf-8、gbk。2个字节就是gbk,3个字节就是utf-8.
2.2 将unicode如何转换成utf-8或gbk等,也就是str与bytes之间的转换

1 # encode 编码,将str转换为bytes,转换为bytes类型后,可以进行存储和传输 2 s1 = 'alex' 3 4 # 将s1这个在内存以unicode编码方式存储的字符串转换为bytes类型,使用utf-8编码方式存储的字符串s11 5 s11 = s1.encode('utf-8') 6 7 print(s11) # b'alex' 8 9 s2 = '中国' 10 11 s22 = s2.encode('utf-8') 12 print(s22) # b'xe4xb8xadxe5x9bxbd' 13 14 # 将s1这个在内存以unicode编码方式存储的字符串转换为bytes类型,使用gbk编码方式存储的字符串s22 15 s22 = s2.encode('gbk') 16 print(s22) # b'xd6xd0xb9xfa'