作者 | 天元浪子
责编 | 刘静
出品 | CSDN博客
无论是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中完全颠倒了!下图稍微补充了一点内容,更有助于理解编码问题。
接下来,我们实战演练一下。
不管是否在字符串前面加了u,只要不在字符串前面使用b,在IDLE中定义的字符串都是Unicode编码,也就是PY3的,其长度就是字符数量,不是字节数。我们把Unicode字符串’abc天圆地方’转成UTF8编码:
UTF8编码就是bytes类型(字节码),长度就是字节数量。我们把Unicode字符串’abc天圆地方’转成GBK编码:
GBK编码也是bytes类型(字节码),长度也是字节数量。我们再来看看,不同编码的字节码能否连接:
看以看出,不同编码的字节码可以连接,但一般不能解码成Unicode(字符串),除非使用ignore参数。
版权声明:本文为CSDN博主「天元浪子」的原创文章。
想为博主点赞?
想要请教博主?
领取专属 10元无门槛券
私享最新 技术干货