带你彻底搞明白python3编码原理( 二 )

运行直接报错了,我们加个断点,看看具体的异常信息:

带你彻底搞明白python3编码原理

文章插图
 
看错误提示是UnicodeDecodeError,python解释器在对encode_demo.py文件解码时,使用默认的UTF-8编码,但是文件本身是gbk编码,所以当碰到有中文没办法识别时,就抛出DecodeError 。
03 敲黑板,划重点#
python3中的str和bytes#
python3的重要特性之一就是对字符串和二进制流做了严格的区分,我们声明的字符串都是str类型,不过Str和bytes是可以相互转换的:
Copydef str_transfor_bytes(): s = '我是一个测试Str' print(type(s)) # str 转bytes b = s.encode() print(b) print(type(b)) # bytes转str c = b.decode('utf-8') print(c) print(type(c))if __name__ == '__main__': str_transfor_bytes()需要注意一点:在调用encode()和decode()方法时,如果不传参数,则会使用python解释器默认的编码格式UTF-8(如果不在python头文件声明编码格式) 。但是如果传参的话,encode和decode使用的编码格式要能对应上 。
python3默认编码是UTF-8?还是Unicode?#
经常在很多文章里看到,python3的默认编码格式是Unicode,但是我在本文中却一直在说python3的默认编码格式是UTF-8,那么哪种说法是正确的呢?其实两种说法都对,主要得搞清楚Unicode和UTF-8的区别(之前文章有提到):
  • Unicode是一个字符集,说白了就是把各种编码的映射关系全都整合起来,不过它是不可变长的,全部都以两个字节或四个字节来表示,占用的内存空间比较大 。
  • UTF-8是Unicode的一种实现方式,主要对 Unicode 码的数据进行转换,方便存储和网络传输。它是可变长编码,比如对于英文字母,它使用一个字节就可以表示 。
在python3内存中使用的字符串全都是Unicode码,当python解释器解析python文件时,默认使用UTF-8编码 。
open()方法默认使用本地编码#
在上面的例子中,我们往磁盘写入文件时,都指定了编码格式 。如果不指定编码格式,那么默认将使用操作系统本地默认的编码格式,比如:Linux默认是UTF-8,windows默认是GBK 。其实这也好理解,因为和磁盘交互,肯定要考虑操作系统的编码格式 。这有区别于encode()和decode()使用的是python解释器的默认编码格式,千万别搞混淆了 。
总结#
不知道你看完上面的例子后,是否已经彻底理解了python3的编码原理 。不过所有的编码问题,都逃不过“编码”和“解码”两个过程,当你碰到编码问题时,先确定源文件使用的编码,再确定目标文件需要的编码格式,只要能匹配,一般就可以解决编码的问题 。
最后,小编想说:我是一名python开发工程师,整理了一套最新的python系统学习教程,想要这些资




推荐阅读