字符编码
一、计算机基础
1、cpu:控制程序的运行(从内存中取出文本编辑器的数据读入内存)
2、内存:运行程序(经CPU操作后,内存中含有文本编辑器的数据)
3、硬盘:存储数据(文本编辑器)
二、文本编辑器存取文件上的原理
- 打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的内容也都是存放与内存中的,断电后数据丢失。
- 要想永久保存,需要点击保存按钮:编辑器把内存的数据刷到了硬盘上。
- 在我们编写一个py文件(没有执行),跟编写其他文件没有任何区别,都只是在编写一堆字符而已。
三、python解释器执行py文件的原理
- 第一阶段:Python解释器启动,此时就相当于启动了一个文本编辑器
- 第二阶段:Python解释器相当于文本编辑器,去打开test.py文件,从硬盘上将test.py的文件内容读入到内存中(小复习:pyhon的解释性,决定了解释器只关心文件内容,不关心文件后缀名)。
- 第三阶段:Python解释器解释执行刚刚加载到内存中test.py的代码( ps:在该阶段,即真正执行代码时,才会识别Python的语法,执行文件内代码,当执行到name="egon"时,会开辟内存空间存放字符串"egon")。
四、字符编码的介绍
4.1什么是字符编码
计算机只认识0、1代码,计算机想要读懂人类写的字符,必须经历一个过程
- 字符 --------》翻译过程 -------》数字
五、乱码分析
1.首先明确概念
- 文件从内存刷到硬盘的操作简称存文件
- 文件从硬盘读到内存的操作简称读文件
2.乱码的两种情况:
- 乱码一:存文件时就已经乱码
存文件时,由于文件内有各个国家的文字,我们单以shiftjis去存,
本质上其他国家的文字由于在shiftjis中没有找到对应关系而导致存储失败。但当我们硬要存的时候,编辑并不会报错(难道你的编码错误,编辑器这个软件就跟着崩溃了吗???),但毫无疑问,不能存而硬存,肯定是乱存了,即存文件阶段就已经发生乱码,而当我们用shiftjis打开文件时,日文可以正常显示,而中文则乱码了。
- 乱码二:存文件时不乱码而读文件时乱码
存文件时用utf-8编码,保证兼容万国,不会乱码,而读文件时选择了错误的解码方式,比如gbk,则在读阶段发生乱码,读阶段发生乱码是可以解决的,选对正确的解码方式就ok了。
六、python2和python三的区别
区别
python2 | python3 |
---|---|
unicode + 指定的coding编码(str类型) | unicode+终端 |
python2:
# coding:gbk
a = '中文' # 用gbk编码存储了这堆0和1
a = u'中文' # 用unicode编码存储了这堆0和1 #加“u”是为了告诉解释器文件类型是utf8,不然就会乱码
print(a)
python3:
# coding:gbk
a = '中文' # 用unicode编码存储了这堆0和1
print(a) # 010101010
七、总结
1.保证不乱码的核心法则就是,字符按照什么标准而编码的,就要按照什么标准解码,此处的标准指的就是字符编码。
- 在内存中写的所有字符,一视同仁,都是Unicode编码,比如我们打开编辑器,输入一个“你”,我们并不能说“你”就是一个汉字,此时它仅仅只是一个符号,该符号可能很多国家都在使用,根据我们使用的输入法不同这个字的样式可能也不太一样。只有在我们往硬盘保存或者基于网络传输时,才能确定”你“到底是一个汉字,还是一个日本字,这就是Unicode转换成其他编码格式的过程了。简而言之,就是内存中固定使用的就是Uncidoe编码,我们唯一能改变的就是存储到硬盘时使用的编码。
- Unicode----->encode(编码)-------->gbk
- Unicode<--------decode(解码)<----------gbk