字符编码

为了解决存储和网络的传输的问题,出现了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类型

python2str = 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.操作系统的语言设置

原文地址:https://www.cnblogs.com/zjaiccn/p/12909577.html