python2和python3中重大的不同是string的类型不同,在python2中,string其实是对应于字节流,而在python3中则直接对应于unicode字符集,如下例子所示:
在python2中string相当于字节流
#python2
>>> astr = "你好"
>>> astr
b"\xe4\xbd\xa0\xe5\xa5\xbd"
>>> "你好" is b"\xe4\xbd\xa0\xe5\xa5\xbd"
True
>>> u'\u4f60\u597d' is b"\xe4\xbd\xa0\xe5\xa5\xbd"
False
这里的 b"\xe4\xbd\xa0\xe5\xa5\xbd"是"你好"的16进制的字节表示方式,而u'\u4f60\u597d'为"你好"的unicode编号,也是以16进制的方式展示的。
而在python3中string相当于unicode字符集
#python3
>>> astr = "你好"
>>> astr
"你好"
>>> u'\u4f60\u597d'
'你好'
>>> u'\u4f60\u597d' is '你好'
True
由此引出的编码与解码的问题我们可以使用如下的图来帮助理解
编码与解码
由上图可以看到,我们将Unicode字符集与字节流进行转换时会产生编码与解码的问题,编码规则就是我们常见的utf-8,ascii,gbk等这些。由字节流转换为Unicode字符集的过程就叫解码,而由Unicode字符集转换字节流的过程则叫编码。
接下来看下编码与解码的示例
#python2
>>> astr = "你好"
>>> astr.decode("utf-8") #从字节流依据utf-8编码规则转换为unicode字符集
u'\u4f60\u597d'
>>> unicode_str = u'你好'
>>> unicode_str
u'\u4f60\u597d'
>>> unicode_str.encode("utf-8") #由 unicode字符集转换为字节流
b'\xe4\xbd\xa0\xe5\xa5\xbd'
#python3
>>> astr
'你好'
>>> astr.encode("utf-8") #由 unicode字符集编码成字节流
b'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode("utf-8")
'你好'