1.3.0 Python 字符编码

1.内存和硬盘都是用来存储的。

内存:速度快,临时存放 硬盘:速度慢,永久保存node

2.文本编辑器存取文件的原理(nodepad++,pycharm,word)

打开编辑器就能够启动一个进程,是在内存中的,因此在编辑器编写的内容也都是存放在内存中的,断电后数据就丢失了。于是须要保存在硬盘上,点击保存按钮或快捷键,就把内存中的数据保存到了硬盘上。在这一点上,咱们编写的py文件(没有执行时),跟编写的其余文件没有什么区别,都只是编写一堆字符而已。python

3.python解释器执行py文件的原理,例如python test.py

第一阶段: python解释器启动,此时就至关于启动了一个文本编辑器 第二阶段: python解释器至关于文本编辑器,去打开test.py,从硬盘上将test.py的文件内容读入到内存中 第三阶段: python解释器执行刚刚加载到内存中的test.py的代码(在该阶段,即执行时,才会识别python的语法,执行到字符串时,会开辟内存空间存放字符串) 总结: python解释器与文本编辑器的异同 相同点: python解释器是解释执行文件内容的,于是python解释器具有读py文件的功能,这一点与文本编辑器同样 不一样点: 文本编辑器将文件内容读入内存后,是为了显示/编辑,而python解释器将文件内容读入内存后,是为了执行(识别python的语法)bash

4.什么是编码?

计算机想要工做必须通电,高低电平(高电平即二进制数1,低电平即二进制数0),也就是说计算机只认识数字。那么让计算机如何读懂人类的字符呢? 这就必须通过一个过程: 字符---------(翻译过程)-------------数字 这个过程实际就是一个字符如何对应一个特定数字的标准,这个标准称之为字符编码。网络

5.如下两个场景涉及到字符编码的问题:

1.一个python文件中的内容是由一堆字符组成的(python文件未执行时) 2.python中的数据类型字符串是由一串字符组成的(python文件执行时)编辑器

6.字符编码的发展史

阶段一:现代计算机起源于美国,最先诞生也是基于英文考虑的ASCII ASCII:一个Bytes表明一个字符(英文字符/键盘上的全部其余字符),1Bytes=8bit,8bit能够表示0-2**8-1种变化,便可以表示256个字符 ASCII最初只用了后七位,127个数字,已经彻底可以表明键盘上全部的字符了(英文字符/键盘的全部其余字符) 后来为了将拉丁文也编码进了ASCII表,将最高位也占用了 阶段二:为了知足中文,中国人定制了GBK GBK:2Bytes表明一个字符,为了知足其余国家,各个国家纷纷定制了本身的编码,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里 阶段三:各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。 因而产生了unicode, 统一用2Bytes表明一个字符, 2**16-1=65535,可表明6万多个字符,于是兼容万国语言 但对于通篇都是英文的文原本说,这种编码方式无疑是多了一倍的存储空间(二进制最终都是以电或者磁的方式存储到存储介质中的) 因而产生了UTF-8,对英文字符只用1Bytes表示,对中文字符用3Bytes ==须要强调的是:==   ==unicode:== 简单粗暴,多有的字符都是2Bytes,优势是字符--数字的转换速度快;缺点是占用空间大。   ==utf-8:== 精准,可变长,优势是节省空间;缺点是转换速度慢,由于每次转换都须要计算出须要多长Bytes才可以准确表示。ui

  • 1.内存中使用的编码是unicode,用空间换时间(程序都须要加载到内存才能运行,于是内存应该是越快越好)
  • 2.硬盘中或网络传输用utf-8,保证数据传输的稳定性。

7、字符编码转换  

unicode------>encode(编码)-------->utf-8 utf-8---------->decode--------->unicode 编码

在这里插入图片描述
文件从内存刷到硬盘的操做简称存文件 文件从硬盘读到内存的操做简称读文件 乱码:存文件时就已经乱码 或者 存文件时不乱码而读文件时乱码 总结: 不管是何种编辑器,要防止文件出现乱码(请必定注意,存放一段代码的文件也仅仅只是一个普通文件而已,此处指的是文件没有执行前,咱们打开文件时出现的乱码) 核心法则就是,文件以什么编码保存的,就以什么编码方式打开

8、 文本编辑器之python解释器

文件test.py以gbk格式保存,内容为:   x='林' 不管是   python2 test.py 仍是   python3 test.py 都会报错(由于python2默认ascii,python3默认utf-8) 除非在文件开头指定#coding:gbkspa

9、程序的执行

python3 test.py 或 python2 test.py(执行test.py的第一步,必定是先将文件内容读入到内存中) 阶段一:启动python解释器 阶段二:python解释器此时就是一个文本编辑器,负责打开文件test.py,即从硬盘中读取test.py的内容到内存中 此时,python解释器会读取 test.py 的第一行内容,#coding :utf-8,来决定以什么编码格式来读入内存,这一行就是来设定python解释器这个软件的编码使用的编码格式这个编码,python2默认使用ASCII,python3中默认使用utf-8 阶段三:读取已经加载到内存的代码(unicode编码的二进制),而后执行,执行过程当中可能会开辟新的内存空间,好比x="egon" 内存的编码使用unicode,不表明内存中全都是unicode编码的二进制, 在程序执行以前,内存中确实都是unicode编码的二进制,好比从文件中读取了一行x="egon",其中的x,等号,引号,地位都同样,都是普通字符而已,都是以unicode编码的二进制形式存放与内存中的 可是程序在执行过程当中,会申请内存(与程序代码所存在的内存是俩个空间),能够存听任意编码格式的数据,好比x="egon",会被python解释器识别为字符串,会申请内存空间来存放"hello",而后让x指向该内存地址,此时新申请的该内存地址保存也是unicode编码的egon,若是代码换成x="egon".encode('utf-8'),那么新申请的内存空间里存放的就是utf-8编码的字符串egon了翻译

10、python2与python3的区别

在python2中有两种字符串类型str和unicode 在python2中,str就是编码后的结果bytes,因此在Python2中,unicode字符编码的结果就是str/bytes3d

#coding:utf-8
s='林' #在执行时,'林'会被以conding:utf-8的形式保存到新的内存空间中
print repr(s) #'\xe6\x9e\x97' 三个Bytes,证实确实是utf-8
print type(s) #<type 'str'>
s.decode('utf-8')
## s.encode('utf-8') #报错,s为编码后的结果bytes,因此只能decode
复制代码

当python解释器执行到产生字符串的代码时(例如s=u'林'),会申请新的内存地址,而后将'林'以unicode的格式存放到新的内存空间中,因此s只能encode,不能decode

s=u'林'
print repr(s) #u'\u6797'
print type(s) #<type 'unicode'>
## s.decode('utf-8') #报错,s为unicode,因此只能encode
s.encode('utf-8') 
复制代码
相关文章
相关标签/搜索