1.字符编码
1.1计算机基础
1.2 文本编辑器存取文件的原理
1.打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的内容也都是存放与内存中,断电即消失
2.要想永久保存,需要点击保存按钮:编辑器把内存的数据刷到了硬盘上。
3.在我们编写一个py文件(没有执行),跟编写其他文件没有任何区别,都只是在编写一堆字符而已。
1.3 python解释器执行py文件的原理
- 第一阶段:python解释器启动,此时就相当于启动了一个文本编辑器
- 第二阶段:python解释器相当于文本编辑器,去打开test.py文件,从硬盘上将test.py的文件内容读入到内存中
- 第三阶段:python解释器执行刚刚加载到内存中test.py的代码(ps:在该阶段,即真正执行代码时,才会识别python的语法,执行文件内代码,当执行name=“egon”时,会开辟内存空间存放字符串“egon”)。
1.4 python解释器与文本编辑的异同
相同点:python解释器是执行文件内容的,因而python解释器具备读py文件的功能,这一点与文本编辑器一样。
不同点:文本编辑器将文件内容读入内存后,是为了显示或者编辑,根本不会理会python的语法,而python解释器将文件内容读入内存后,执行python代码、会识别python语法
1.5 字符编码介绍
1.什么是字符编码:
计算机要想工作必须通电,即用‘电’驱使计算机干活,也就是说‘电’的特性决定了计算机的特性。电的特性即高低平(人类从逻辑上将二进制1对应高电频,二进制数0对应低电频),关于磁盘的磁特性也是同样的道理。
结论:计算机只认识数字。
- 字符 --------》翻译过程 -------》数字
总而言之,字符编码是将人类的字符编码成计算机能识别的数字,这种转换必须遵循一套固定的标准,该标准无非是人类字符与数字的对应关系,称之为字符编码表。
2.涉及到字符编码的两个场景
- 一个Python文件中的内容是由一堆字符组成的,存取均涉及到字符编码问题(Python文件并未执行,前两个阶段均属于该范畴)。
- Python中的数据类型字符串是由一串字符组成的(Python文件执行时,即第三个阶段)。
3.字符编码发展史与分类
计算机由美国人发明,最早的字符编码为ASCII,只规定了英文字母数字和一些特殊字符与数字的对应关系。最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号。
# acill编码的转换关系的方法
print(chr(65))
print(ord('a'))
ascii编码 --》 美国人
日本人也造一种编码 --》Shift_JIS
韩国人也造一种编码 --》 Euc-kr
中国人也造一种编码 --》gb2312
这个时候就出现了unicode编码(一种对应关系)
unicode可以认识万国编码
硬盘中无论躺着什么格式的编码文件,unicode都可以识别,假设你看日本的片子,从硬盘中读取fuck编码,然后unicode识别,unicode帮你转换成gb2312,解决了乱码的问题,用unicode存
unicode存的时候多占用空间,所以出现了utf8(只和unicode一一对应)--》解决了unicode内存占用的问题
现在所有的电脑都是这样的 --》 内存中unicode取,存用utf8存(硬盘),全世界的人写代码/写文件都是用utf8
windows系统的记事本默认编码 是 gbk,除此之外都是utf8
用什么编码写,就用什么编码读
写用utf8,存用utf8,读用gbk--》乱码
写用utf8,存用gbk,--》乱码 ,读用 --》除非你找日文编码,放入中文 の(中文的一个符号,不是日文的“的”)
4.乱码分析
首先明确概念
- 文件从内存刷到硬盘的操作简称存文件
- 文件从硬盘读到内存的操作简称读文件
乱码的两种情况:
- 乱码一:存文件时就已经乱码
存文件时,由于文件内有各个国家的文字,我们单以shiftjis去存,
本质上其他国家的文字由于在shiftjis中没有找到对应关系而导致存储失败。但当我们硬要存的时候,编辑并不会报错(难道你的编码错误,编辑器这个软件就跟着崩溃了吗???),但毫无疑问,不能存而硬存,肯定是乱存了,即存文件阶段就已经发生乱码,而当我们用shiftjis打开文件时,日文可以正常显示,而中文则乱码了。
- 乱码二:存文件时不乱码而读文件时乱码
存文件时用utf-8编码,保证兼容万国,不会乱码,而读文件时选择了错误的解码方式,比如gbk,则在读阶段发生乱码,读阶段发生乱码是可以解决的,选对正确的解码方式就ok了。
2.python解释器(文本编辑器)解释python代码的流程
1.python解释器相当于文本编辑器,把代码读入python解释器 --》 字符编码 -》 python2默认是ascill,python3默认utf8 --》 上coding头
中文 # gbk编码的中文加
2.识别代码 --》print有意义 --》 语法问题
# coding:gbk # 告诉python解释器用gbk去完成第一步,读入字符
中文
3.产生结果 --》 跑到终端--》字符编码
终端有一个特性:你的电脑是什么编码,就按照什么编码的来,windows终端是gbk
2.python2和python3的编码区别
1 python2
python2有两种存储变量的形式,第一种:unicode;第二种:按照coding头来的
假设python2用utf8存储x='中文'
,当你print(x)
的时候,终端接收gbk的变量x,但是windows终端编码是utf8,会乱码
假设python2用unicode存储,终端接受的是unicode,windows终端编码是utf8还是gbk重要吗?不会乱码=
# coding:gbk
lt1 = '中文' # utf存储的
# lt1 = ['中文'] # []让他不用终端的编码转化,显示01010101001
print lt1 # ['xe4xb8xadxe6x96x87']
lt2 = u'中文' # u'中文'让他变成unicode # 早期用python2定义中文,必须得加上u,让他变成unicode存储
# lt2 = [u'中文']
print lt2 # '中文'
2 python3
python3只有一种存储变量的形式,unicode
python3用unicode存储,终端接收的是unicode,widonws终端编码是utf还是gbk不重要,不会乱码
lt1 = '中文' # == u'中文'
print(lt1)