字符编码
1.知识储备
1.1软件运行
1、软件运行前,软件的代码及其相关数据都是存放于硬盘中的
2、任何软件的启动都是将数据从硬盘中读入内存,然后cpu从内存中取出指令并执行
3、软件运行过程中产生的数据最先都是存放于内存中的,若想永久保存软件产生的数据,则需要将数据由内存写入硬盘
1.2文本编辑器读取文件内容的流程
阶段1、启动一个文件编辑器(文本编辑器如 nodepad++,pycharm,word)
阶段2、文件编辑器会将文件内容从硬盘读入内存
阶段3、文本编辑器会将刚刚读入内存中的内容显示到屏幕上
1.3 python解释器执行文件的流程
阶段1、启动python解释器,此时就相当于启动了一个文本编辑器
阶段2、python解释器相当于文本编辑器,从硬盘上将test.py的内容读入到内存中
阶段3、python解释器解释执行刚刚读入的内存的内容,开始识别python语法
1.4 python解释器与文件编辑器的异同
相同点:前两个阶段二者完全一致,都是将硬盘中文件的内容读入内存,详解如下:
python解释器是解释执行文件内容的,因此python解释器具备读py文件的功能,这一点与文本编辑器一样不同点:在阶段3,针对内存中读入的内容处理方式不同,详解如下:
文本编辑器将文件内容读入内存后,是为了显示或者编辑,根本不去理会python的语法,而python解释器将文件内容读入内存后,是为了执行python代码、会识别python语法)
2.字符编码
2.1什么是字符编码
人类与计算机交互的过程中,人类使用的语言有中文字符,英文字符,日文字符等
而计算机只能识别机器语言,也就是二进制
因此,交互的过程之间需要一个翻译的环节
翻译的过程必须参照一个特定的标准,该标准称之为字符编码表,该表上存放的就是字符与数字一一对应的关系。
字符编码中的编码指的是翻译或者转换的意思,即将人能理解的字符翻译成计算机能识别的数字
2.2字符编码表有哪些种类
1.ASCII表
ASCII表的特点:
1、只有英文字符与数字的一一对应关系
2、一个英文字符对应1Bytes,1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字
2.GBK表
GBK表的特点:
1、只有中文字符、英文字符与数字的一一对应关系
2、一个英文字符对应1Bytes
一个中文字符对应2Bytes
补充说明:
1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符
2Bytes=16bit,16bit最多包含65536个数字,可以对应65536个字符,足够表示所有中文字符
2.3 unicode
1.unicode
两大特点:
1.存在所有语言中的所有字符与数字的一一对应关系,即兼容万国字符
2.与传统的字符编码的二进制数都有对应关系
【很多地方或老的系统、应用软件仍会采用各种各样传统的编码,这是历史遗留问题。此处需要强调:软件是存放于硬盘的,而运行软件是要将软件加载到内存的,面对硬盘中存放的各种传统编码的软件,想让我们的计算机能够将它们全都正常运行而不出现乱码,内存中必须有一种兼容万国的编码,并且该编码需要与其他编码有相对应的映射/转换关系,这就是unicode的第二大特点产生的缘由】
2.编码与解码
由字符转换成内存中的unicode,以及由unicode转换成其他编码的过程,都称为编码encode
由内存中的unicode转换成字符,以及由其他编码转换成unicode的过程,都称为解码decode
2.4 utf-8的由来
传统的字符编码因为只支持与之匹配的字符种类,所以计算机运行过程中不能稳定运行万国字符,因此需要一种识别万国字符的编码格式。理论上是可以将内存中unicode格式的二进制直接存放于硬盘中的,但由于unicode固定使用两个字节来存储一个字符,如果多国字符中包含大量的英文字符时,使用unicode格式存放会额外占用一倍空间(英文字符其实只需要用一个字节存放即可),然而空间占用并不是最致命的问题,最致命地是当我们由内存写入硬盘时会额外耗费一倍的时间,所以将内存中的unicode二进制写入硬盘或者基于网络传输时必须将其转换成一种精简的格式,这种格式即utf-8(全称Unicode Transformation Format,即unicode的转换格式)
utf-8是针对unicode的可变长度字符编码:一个英文字符占1Bytes,一个中文字符占3Bytes,生僻字用更多的Bytes存储
3.字符编码的应用
3.1如何保证存取数据不乱码
保证存的时候不乱:在由内存写入硬盘时,必须将编码格式设置为支持所输入字符的编码格式
保证存的时候不乱:在由硬盘读入内存时,必须采用与写入硬盘时相同的编码格式
3.2 python解释器执行文件的前两个阶段
执行py文件的前两个阶段就是python解释器读文本文件的过程,与文本编辑读文本文件的前两个阶段没有任何区别
要保证读不乱码,则必须将python解释器读文件时采用的编码方式设置为文件当初写入硬盘时的编码格式
如果没有设置,python解释器则才用默认的编码方式,在python3中默认为utf-8,在python2中默认为ASCII,我们可以通过指定文件头来修改默认的编码
# coding: 当初文件写入硬盘时采用的编码格式
3.3 python解释器执行文件的第三个阶段
python解释的第三个阶段开始识别python语法
python3中,字符串类的值默认用Unicode格式存储
python2中,需要在字符串类型前加u,强制存储成Unicode格式,就不会乱码
3.4字符串encode编码与decode解码的使用
# 1、unicode格式------编码encode-------->其它编码格式
>>> x='上' # 在python3中 '上'被存成unicode
>>> res=x.encode('utf-8')
>>> res,type(res) # unicode编码成了utf-8格式,而编码的结果为bytes类型,可以当作直接当作二进制去使用
(b'\xe4\xb8\x8a', <class 'bytes'>)
# 2、其它编码格式------解码decode-------->unicode格式
>>> res.decode('utf-8')
'上'
//非原创,仅供交流学习//

浙公网安备 33010602011771号