Python|Python2到Python3的奇葩字符串问题,小心踩坑哦

Python|Python2到Python3的奇葩字符串问题,小心踩坑哦


很多编程语言或者软件在升级版本的时候 , 不可避免地会存在一些历史遗留问题 , 而为了兼容这些历史遗留问题通常都要做一些兼容性的调整 , 也会出现一些很容易混淆的问题 。 让人哭笑不得 , 一不注意就会踩坑 。 最典型的就是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.’
【Python|Python2到Python3的奇葩字符串问题,小心踩坑哦】就是Python2里的Unicode类型 , 和Python2里面的前面加个u的类型是一样的 。
而Python3里面的bytes则和Python2里面的str很类似 。 都包含原始的8位值【即一个字节码由8个二进制位组成】 。 所以我们基本上可以得出下图的对应关系:

而在Python3里 , 想要用到bytes类型 , 则需要在字符串前面加上一个b 。 像这样:
b‘this is a test.’
很奇怪是不是 , 那么为什么Python要做这么奇葩的事情呢?原因在于 , 随着计算机硬件的发展 , 原来系统开销较大的Unicode已经从当时的小众变成了大众 。 而原来的各种编码则在应用中从大众变成了小众 。
就好像原来大家都穷 , 吃的都是小米饭 , 吃碗白米饭要发个朋友圈 。 后来大家都吃上了白米饭 , 反而吃一次小米饭成了养生了 , 发个朋友圈一样 。
所以为了更符合大众的实际应用习惯 , Python就弄出了这样一个奇葩的兼容性关系来 。
觉得有用的话 , 欢迎关注活在信息时代哦:)