python2/3 中的编解码总结

163 阅读2分钟

前两天被python2的编解码搞的云里雾里的,所以决定周末花点时间来总结一下这个问题。

首先,我们在控制台上做些基本的尝试。

第一次看见这个的时候你是不是也会感到懵逼?关于这个类型的问题python2和 python3是完全的不一样的,网上写的东西也是乱七八糟的。后来我发现,其实在python2中是没有bytes 这种类型的,我们在python2中的str其实并不是字符串,而是一个字节数组,就是bytes,而真正的字符串其实是 unicode。在python3中的str其实就是字符串,是unicode,而bytes是字节数组。是不是挺乱的,我们来放张图理解下。

嗯,理解了这个就能解释通很多问题了。至于为什么python2的表示方法这么奇怪。这个,我只能说是历史遗留的问题吧。

然后理解了上面这个,我们的编解码就简单多了。把码位(unicode字符)转换成具体字节(byte)的过程叫编码encode, 把字节转换成码位(unicode字符)的过程叫做解码。

首先,我们先来看python3的。

嗯,非常清楚,bytes类型和unicode 字符串的转换,当使用了不正确的编解码方式的时候会报错。然后我们再来看看python2的,上面说了,python2的str其实就是bytes,所以str只能解码不能编码。

嗯?好像有哪里不对。str是字节,怎么会有编码一说呢。 unicode 既然是字符,那么也是只能编码,不能解码呀。。python2里面这两个操作居然都是返回了其本身。。大哥,你报错呀,你倒是报错呀。。

好了,估计python2 里面的这些都是历史的遗留吧,python3里面的看着就清爽多了。就说到这里吧。