python编程的一大坑:python处理中文编码和解码中常见的乱码问题

unicode

ascii默认八位存一位,而unicode默认是16位存一个,所有英文用ascii都是8位,但是使用unicode都是16位,于是出现了一个unicode的扩展集,utf-8,可变长的,所有的英文还是按照ascii存储,一个字节,所有的中文全部三个字节,可以简单的把unicode看成所有编码集的大家长,它包含一切,任何编码集都可以在它中找到。

python2

在python2中默认的编码格式是ascii,此时str=“你好”,那么这个你好是ascii编码,会报错,而且当encode()不指定参数的时候也是默认先用ascii编码码的,在python2上写# -*- coding: utf-8 -*-的意思是该程序使用utf-8编码,这样str=“你好”,那么就是utf-8编码的了,但是encode()不指定参数的时候,默认也是使用ascii编码的

注:想学习Python的小伙伴们

可以

进群:984137898

领取从0到1完整学习资料 视频  精品书籍 一个月经典笔记和99道练习题及答案

python3

而在python3中默认的编码格式是unicode,这个这样理解,当我们在程序中str=“你好”这个str是unicode编码的,当我们encode()没有指定编码集的时候,这个encode是按照utf-8进行编码的。而python3上写#-*- coding: gbk -*-意思是该程序使用gbk编码,但是str=“你好”依然是unicode编码的,而且encode()没有指定编码集的时候,这个encode是按照utf-8进行编码的。所以个人认为在python3的时候,页面编码使用gbk没有任何意义

该方法输出当前默认的编码

python3输出utf-8,但它的默认编码格式是unicode

以下代码使用python2级版本

python2中该程序在str.encode()之前会默认按照ascii解码有一部隐式操作(python3中没有,因为一开始就是unicode编码的),虽然有(# -*- coding: utf-8 -*-),所以中文用ascii解码当然会出问题了,解决办法就是手动进行解码,这样就不会用ascii解码了

该程序没有出问题是因为手动使用了utf-8进行了解码,这样在解码的时候就不会有一个隐形的ascii解码了,str因为# -*- coding: utf-8 -*-所以默认使用utf-8编码,用utf-8进行解码str1此时是unicode,unicode可以正常显示中文的,再用utf-8进行编码还是你好

将utf-8编码的str转成gbk编码的

按照道理来说unicode是大家长,编码成gbk也应该是没有问题的,那为何输出乱码呢?

其实编码成gbk这一步没有任何问题,问题出在了控制台显示的编码上,因为我的pycharm编码为utf-8,所以utf-8直接解码gbk肯定会出问题,所以,把pycharm的编码改成gbk就ok了

将刚才的gbk转成utf-8

编码和解码

演示完这两个之后,因为unicode可以看成大家长,所以中文可以在两种编码之间进行转换时,可以使用unicode来进行过渡,一种编码先解码成unicode,再编码成另一种编码

这个图说明只能unicode编码成其它,其它解码成unicode

因为# -*- coding: utf-8 -*-,所以str=“你好”将会默认使用utf-8进行编码

也可以str=u“你好”

前面使用u,所以表示你好使用uncicode编码,输出也会正常输出中文,因为unicode包含一切

以上都是在2级版本的讲解,

其实所有版本两种编码的转换都一样,就是通过unicode进行转换,所以其它两种编码(不只是utf-8和gbk)都是按照unicode做中间转换的思想去转换

在python3中默认的编码格式是unicode,这个这样理解,当我们在程序中str=“你好”这个str是unicode编码的,当我们encode()没有指定编码集的时候,这个encode是按照utf-8进行编码的。

在python3中程序的默认编码unicode

所以在python3中只要str=“你好”那么这个你好默认是unicode进行编码

可以对其进行编码,编成gbk

python3编码其实有两个过程,一个是编码utf-8,gbk这样的,一个是编码成子节数组,所以下面输出了编码成gbk的自节数组,同理解码也有两个过程是和它相反的

下面程序,你好是unicode编码,所以可以方便的将其编码成gbk,不会出问题

可以看输出结果,第一输出的是gbk编码的了,第二输出的是编码好的子节数组

右下角这个是该文件的编码格式,个人感觉没什么用,因为在python2为了输入中文,我们必须要指定#-*- coding: 编码 -*-,这样右下角这个文件编码会根据#-*- coding: 编码 -*-而变化

这个在python3中如果右下角是gbk,那么就一定要写一句# -*- coding: gbk -*-不然会出问题,但是即使写了也没有任何效果在python3中无论是写# -*- coding: utf-8 -*-还是# -*- coding: gbk -*-都不会有效果,str=“你好”依然是unicode编码

猜你喜欢

转载自blog.csdn.net/weixin_42209553/article/details/89762973