一.字符编码基础知识
1.计算机硬件包括CPU、硬盘、内存,其中CPU负责从内存中读取指令并解码执行。
操作系统和应用软件运行时都是先把程序加载到内存中,然后应用程序通过调用操作系统提供的接口,来间接实现硬件的使用。
2.文本编辑器存储原理
应用程序加载到内存中,先将编辑的内容存储在内存中,然后通过点击保存然后将文件刷到硬盘上,确保在断电后文件内容不丢失。
3.python解释器执行python文件的原理
第一阶段:python解释器启动,相当于开启了一个文本编辑器
第二阶段:python解释器相当于文本编辑器,将python文件读到内存中(python解释器的特性决定了只关注文件的内容,不在意文件的后缀名)
第三阶段:python解释器开始执行加载到内存中的代码(在执行时才会识别python的语法,比如识别到定义了一个变量,会在内存中开辟一个新的空间来存放变量。)
python解释器之余文件编辑器的异同:
相同:python解释器和文件编辑器一样,都有读取文件的功能
不同:文件编辑器读入内存是为了显示,而python解释器是为了执行(识别python语法)
二.什么是字符编码
计算机在通电时才能工作,而计算机只认识数字(高频和低频对应二进制中的数字1和0)。
由于人们在进行交流时都是通过一连串字符来传达意思的,为了能让计算机为人们服务,这就需要这么一个过程:
字符------->翻译--------->数字(一个字符如何对应一个或一串特定的数字)
以下两个场景下涉及到字符编码的问题:
1. 一个python文件中的内容是由一堆字符组成的(python文件未执行时)
2. python中的数据类型字符串是由一串字符组成的(python文件执行时)
三.字符编码的发展:
英美:ASCII码,一个Bytes代表一个字符,1Bytes=8bit
中文:GBK码,2Bytes代表一个字符
为了方便各种语言之间的通信,出现了万国码:Unicode码(所有字符都是2Bytes),utf-8码(对英文字符只用1Bytes表示,对中文字符用3Bytes)
注意:
unicode:简单粗暴,所有字符都是2Bytes,优点是字符->数字的转换速度快,缺点是占用空间大
utf-8:精准,对不同的字符用不同的长度表示,优点是节省空间,缺点是:字符->数字的转换速度慢,因为每次都需要计算出字符需要多长的Bytes才能够准确表示
1.内存中使用的编码是Unicode码,采用用空间换时间的策略(所有程序都需要先加载到 内存中才能运行)
2.硬盘中或者网络传输用utf-8,网络I/O或磁盘I/O延迟要远大于utf-8的转换延迟,而且I/0应该尽可能节省带宽,保证传输数据的稳定
四.字符编码的使用
1.文本编辑器.编码转换:
unicode----->encode-------->utf-8
utf-8-------->decode---------->unicode
2.乱码的原因
第一个:在编码时已经乱码,比如文件内容中有中文和日文,而在往硬盘存储时编码格式是gbk,那么日文就没有与之匹配的对应关系,造成无法正确存储,也就是数据损坏。
第二个:存文件时不乱码而读文件时乱码,比如选择了和存储时不一样的编码方式,比如gbk码存储,utf-8码读取
总结:文件以什么编码保存,就以什么编码打开
五.程序的执行
第一阶段:启动python解释器
第二阶段:此时python文件解释器相当于文本编辑器,将硬盘中的文件读入到内存
第三阶段:读取已经加载到内存中的代码(Unicode编码的二进制),然后执行,执行过程中可能会开辟新的内存空间
六.python2和python3的区别:
1.在python2中有两种字符串类型:str和unicode
2.在python3中也有两种字符串类型:str和Bytes