为了解决存储和网络的传输的问题,出现了UTF,即对unicode进行转化
Utf-8:使用1,2,3,4个字节表示所有字符,优先使用1个字符,无法满足空间则增加到2 --> 3 -- > 4
Utf-16:使用2,4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示
Utf-32:使用4个字节表示所有字符;
总的来说UTF是为unicode编码设计的一种在存储和传输时节省空间的编码方案;
数据存到硬盘上一定是以二进制的形式存放的
Python3执行代码的过程(Python默认文件代码就是utf8)
1.解释器找到代码文件,把代码字符串按照文件头定义的编码加载到内存,转换成Unicode
2.把代码字符串按照语法规则进行解释
3.所有的变量字符都会以Unicode编码声明
但是不是所有解释器都可以做到,Python2就不可以,既然python2并不会自动的把文件编码转换成Unicode存在内存里,那就只能使出最后一招了,
自己人肉转,Python3自动把文件编码转成Unicode必定是调用了什么。这个方法就是,decode(解码)和encode(编码)
Utf8 --> decode --> unicode
Unicode --> encode --> gbk/utf8
Python3 默认解释器编码是 utf8
存放在内存里的字符串编码是 unicode
Python2 默认的解释器编码是 ASCII
存放在内存里的字符串编码是ASCII,
如果文件头使用#! encoding : 编码名称 声明了字符编码,那字符串编码就是 声明的编码
使用print(type(s)) 查看字符串的数据类型,这样我们就可以查看decode和encode转换后的字符串类型
但是问题来了,如果只给你了一串乱码,你如何判断他是什么类型的字符串乱码呢?
解决: 查看Unicode的映射表
C9 --16进制
12 9
8421 8421
1100 1001 转成2进制
4 9 把8那位去掉 计算出来的就是49 去Unicode映射表里去查看,就知道使用的是什么编码了
Python bytes类型
在python2中str = bytes , 既然这个为什么不直接用str 原因是不光有字符串还有图片、视频等二进制格式的数据,他们是以bytes类型存放的
以utf-8编码的字符串,在windows上不能显示,因为windows默认编码是gbk。
定义unicode类型 s = u’路’
如果在Python2实现写一个软件,在全球各国的电脑上直接看?
以unicode编码 -- 全球的电脑都支持unicode
Py2:以utf8 or gbk..编码的代码,代码内容加载到内存,并不会转成Unicode,编码依然是utf8 or gbk
Py3:以utf8 or gbk..编码的代码,代码内容加载到内存里,会自动转换成Unicode
在Python3里 str = Unicode
编码转化是不可退的
最后Python只要出现编码问题,无非是哪里的编码设置出错了:
常见的编码错误的原因有:
1.Python解释器的默认编码
2.Python源文件文件编码
3.Terminal使用的编码
4.操作系统的语言设置