任何一个程序想要运行,必须先有硬盘加载到内存,然后由cpu去内存取只执行。运行着的应用程序的数据,必须在内存运行。python运行文件的三步,首先把python文件解释器读取到内存上,然后应用程序代码文本文件读取到内存上,最后python解释器对程序代码进行编译成计算机识别的代码。
字符编码
字符编码和文本文件有关。文字,字母,数字符号等都属于字符。常见的文本文件,记事本,word文件等。但是图片和视频不属于文本文件。
我们写的文件要想之后还可以查看,文件就要存储到硬盘中。其过程就是计算机将字符对应字符编码表翻译成二进制数存入硬盘。早期计算机使用英文字符,存入硬盘占用1Btes,也就是八位二进制(8Bts),
输入字符 >>>>>>(字符编码表)>>>>> 二进制数
# 存储单位小知识 8bits = 1Bytes 1024Byes = 1kb 1024kb = 1Mb 1024Mb = 1GB 1024GB = 1T 1024T = 1P
后来各个国家也是用计算机,但是使用英文十分不方便。各个国家都绘制自己的编码表,中国是用GBK编码表,中文字符占2Btes。日本使用shift-jis编码表,韩国使用ECU-KR编码表。
万国码unicode
万国码unicode出现,它可以兼容各国语言,各国语言都可以识别。unicode编码统一所有字符都占2Btes。但是这种编码也有缺点,就是浪费存储空间,程序运行效率低。在此基础上出现了优化的utf-8编码。utf-8编码会将unicode用文字夫由原来的2Btes变成1Btes,将中文的2Btes变成3Btes存入硬盘中。
对于存入文件的过程可以理解为:
数据保存到硬盘
1, 内存中的unicode格式二进制数据数字 >>>>> (encod) >>>> utf-8
硬盘中的数据有硬盘读到内存
1, 硬盘中的utf-8格式的二进制数据 >>>>解码(decode) >>>unincode格式的二进制数据
要明白的是用户输入分时候,无论输入什么字符都能够兼容万国字符。其他国家的数据有硬盘读到内存的时候unicode与其他各个国家的编码都有对应关系。
在python2默认使用ASCII码(因为在开发pyhon2解释器时uniocode还没有盛行),而在python3中默认使用的是utf-8。python3字符串默认使用unicode编码格式的二进制数
文件头
在文件中的字符编码运行之前,要明白的是,文件以什么格式存入硬盘就应该以什么格式读出来。可以想象这样一个场景,发密电码,发送者以一种编码方式发出,解码者就必须一相同编码方式才能解密。如果不是,那么将会得到一堆乱码。计算机也是如此
# 以gbk格式存入编码,以utf-8格式解码 a = '学习' # 数据字符串‘学习’ a1 = a.encode('gbk') # 以gbk格式存入 a2 = a1.decode('utf-8') # 以utf-8格式读出 print(a2) # 结果是可以读但是无法解码,导致乱码 ѧϰ # 以gbk格式存入,以gbk格式读出 a = '学习' # 数据字符串‘学习’ a1 = a.encode('gbk') # 以gbk格式存入 a2 = a1.decode('gbk') # 以utf-8格式读出 print(a2) 学习
总结:
在读取文件的时候,如果乱码,很大可能就是读的时候与存入编码格式不同所致
(在文件看到:# coding:utf-8 ,它的意思告诉解释器用utf-8编码解码。)