python2和python3编码(一文了解py2/py3编码问题)
无论是py2还是py3 ,都使用unicode作为内存编码 ,简称内码 。保存在python解释器内存中的文本,输出到屏幕 、编辑器 ,或者保存成文件的时候 ,都要将内码转换成utf8或者gbk等编码格式;同样 ,python解释器从输入设备接收文本 ,或者从文件读取文本的时候 ,都要将utf8或者gbk等编码转换成unicode编码格式 。
因此 ,无论是py2还是py3 ,想要在unicode 、utf8、gbk等编码格式之间转换的话 ,下图是通用的:
我们之所以会产生困惑 ,是因为py2和py3给这些编码格式指定了令人困惑的名字 。
py2的字符串有两种类型:unicode类型和str类型 。
py2的unicode类型就是unicode编码,py2的str类型泛指除unicode编码之外的所有编码 ,包括ascii编码 、utf8编码 、gbk编码 、cp936编码等 。
py3的字符串也有两种类型:bytes类型和str类型 。py3的str类型就是unicode编码 ,py3的bytes类型泛指除unicode编码之外的所有编码,包括ascii编码 、utf8编码 、gbk编码 、cp936编码等 。
同样是str类型 ,在py2和py3中完全颠倒了!下图稍微补充了一点内容 ,更有助于理解编码问题 。
接下来,我们实战演练一下 。
>>>s=abc天圆地方 >>>type(s) <classstr> >>>len(s) 7 >>>s abc天圆地方 >>>print(s) abc天圆地方 >>>s.encode(unicode-escape) babc\\u5929\\u5706\\u5730\\u65b9不管是否在字符串前面加了u ,只要不在字符串前面使用b ,在IDLE中定义的字符串都是unicode编码 ,也就是py3的<class ‘str’> ,其长度就是字符数量 ,不是字节数。我们把unicode字符串’abc天圆地方’转成utf8编码:
>>>s_utf8=s.encode(utf8) >>>type(s_utf8) <classbytes> >>>len(s_utf8) 15 >>>s_utf8 babc\xe5\xa4\xa9\xe5\x9c\x86\xe5\x9c\xb0\xe6\x96\xb9 >>>print(s_utf8) babc\xe5\xa4\xa9\xe5\x9c\x86\xe5\x9c\xb0\xe6\x96\xb9 >>>s_utf8.decode(utf8) abc天圆地方utf8编码就是bytes类型(字节码) ,长度就是字节数量 。我们把unicode字符串’abc天圆地方’转成gbk编码:
>>>s_gbk=s.encode(gbk) >>>type(s_gbk) <classbytes> >>>len(s_gbk) 11 >>>s_gbk babc\xcc\xec\xd4\xb2\xb5\xd8\xb7\xbd >>>print(s_gbk) babc\xcc\xec\xd4\xb2\xb5\xd8\xb7\xbd >>>s_gbk.decode(s_gbk) abc天圆地方gbk编码也是bytes类型(字节码) ,长度也是字节数量 。我们再来看看 ,不同编码的字节码能否连接:
>>>ss=s_utf8+s_gbk >>>ss babc\xe5\xa4\xa9\xe5\x9c\x86\xe5\x9c\xb0\xe6\x96\xb9abc\xcc\xec\xd4\xb2\xb5\xd8\xb7\xbd >>>ss.decode(utf8) Traceback(mostrecentcalllast): File"<pyshell#64>",line1,in<module> ss.decode(utf8) UnicodeDecodeError:utf-8codeccantdecodebyte0xccinposition18:invalidcontinuationbyte >>>ss.decode(gbk) abc澶╁渾鍦版柟abc天圆地方 >>>ss.decode(utf8,ignore) abc天圆地方abcԲط >>>ss.decode(gbk,ignore) abc澶╁渾鍦版柟abc天圆地方看以看出 ,不同编码的字节码可以连接,但一般不能解码成unicode(字符串) ,除非使用ignore参数。
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!