很多编程语言或者软件在升级版本的时候,不可避免地会存在一些历史遗留问题,而为了兼容这些历史遗留问题通常都要做一些兼容性的调整,也会出现一些很容易混淆的问题。让人哭笑不得,一不注意就会踩坑。最典型的就是MySQL数据库里面,utf8编码不是真正的utf8编码,而utf8mb4才是真正意义上,我们想要用的,标准的utf8编码。从而导致很多新人在一些情况下会碰上很奇葩的问题。
类似的问题在Python2到Python3的升级中也有一个。那就是字符串的类型。
在Python2里,字符串序列有两种:str和Unicode。这里面str的编码是和解释器有关的,可以简单粗暴的理解为“系统用的编码”,如果系统编码是GBK的,那么str的编码就是GBK。而Unicode编码则是正常的Unicode编码。在Python2编码的时候,如果正常写一个字符串,例如:
‘this is a test.’
这个字符串默认就是str的。如果在前面加一个u,即
u‘this is a test.’
那么这个编码就变成了Unicode的。
然而在Python3里,同样也有两种字符序列类型,str和bytes。这里面的str即为Unicode,就是说Python2里面的Unicode类型,在Python3里没有了,Python3里随便写一个字符串,例如:
‘this is a test.’
就是Python2里的Unicode类型,和Python2里面的前面加个u的类型是一样的。
而Python3里面的bytes则和Python2里面的str很类似。都包含包含原始的8位值【即一个字节码由8个二进制位组成】。所以我们基本上可以得出下图的对应关系:
而在Python3里,想要用到bytes类型,则需要在字符串前面加上一个b。像这样:
b‘this is a test.’
很奇怪是不是,那么为什么Python要做这么奇葩的事情呢?原因在于,随着计算机硬件的发展,原来系统开销较大的Unicode已经从当时的小众变成了大众。而原来的各种编码则在应用中从大众变成了小众。
就好像原来大家都穷,吃的都是小米饭,吃碗白米饭要发个朋友圈。后来大家都吃上了白米饭,反而吃一次小米饭成了养生了,发个朋友圈一样。
所以为了更符合大众的实际应用习惯,Python就弄出了这样一个奇葩的兼容性关系来。
觉得有用的话,欢迎关注活在信息时代哦:)
留言与评论(共有 0 条评论) “” |