python小知识之字符编码
一、导学知识
1、三大核心硬件
所有软件都是运行硬件之上的,与运行软件相关的三大核心硬件为cpu、内存、硬盘
1、程序的数据和程序的代码事先都是存放在内存当中的
2、任何软件的启动都是将数据从硬盘中读入内存,然后cpu从内存中取出指令并执行
3、软件运行过程中产生的数据最先都是存放于内存中的,若想永久保存软件产生的数据,则需要将数据由内存写入硬盘
2、 文本编辑器读取文件内容的流程
1、启动一个文件编辑器
2、文件编辑器会将文件内容从硬盘读入内存
3、文本编辑器会将刚刚读入内存中的内容显示到屏幕上
3、python解释器执行文件的流程
1、启动python解释器,此时就相当于启动了一个文本编辑器
2、python解释器相当于文本编辑器,从硬盘上将a.py的内容读入到内存中
3、python解释器解释执行刚刚读入的内存的内容,开始识别python语法
前两步会运用到字符编码读的运用,第三部取出来识别的时候也要运用字符编码,保证识别变量定义的语法的时候不是乱码
二、字符编码介绍
1、定义
人类在与计算机交互时,用的都是人类能读懂的字符。
存: 字符-------------->翻译-------------->数字
读: 字符<--------------翻译<--------------数字
翻译的过程必须参照一个特定的标准,该标准称之为字符编码表,该表上存放的就是字符与数字一一对应的关系(如 ASCII)。
2、 字符编码表的发展史
2.1、一家独大
由于计算机起源于美国,所以只考虑英文字符,所以发明的了ASCII表
ASCII特点: 1、只支持英文字符串 2、采用8位二进制数对应一个英文字符串
2.2、诸侯割据、天下大乱
为了让计算机能够识别中文和英文,中国人引入了GBK
例如还有韩国的Euc-kr和日本的shift-JIS。
GBK表: 1、支持英文字符、中文字符 2、采用8位(8bit=1Bytes)二进制数对应一个英文字符串 采用16位(16bit=2Bytes)二进制数对应一个中文字符串
2.3、分久必合
引入了unicode,它的存在所有语言中的所有字符与数字的一一对应关系,即兼容万国字符,与传统的字符编码的二进制数都有对应关系。
由于软件放于硬盘,所以硬盘中存放的各种传统编码的软件,所以就通过unicode完成该编码需要与其他编码有相对应的映射/转换关系。
英文字符可以被ASCII识别
英文字符--->unciode格式的数字--->ASCII格式的数字中文字符、英文字符可以被GBK识别
中文字符、英文字符--->unicode格式的数字--->GBK格式的数字日文字符、英文字符可以被shift-JIS识别
日文字符、英文字符--->unicode格式的数字--->shift-JIS格式的数字
3、UTF-8的出现
理论上是可以将内存中unicode格式的二进制直接存放于硬盘中的,但由于unicode固定使用两个字节来存储一个字符,如果多国字符中包含大量的英文字符时,使用unicode格式存放会额外占用一倍空间(英文字符其实只需要用一个字节存放即可),然而空间占用并不是最致命的问题,最致命地是当我们由内存写入硬盘时会额外耗费一倍的时间,所以将内存中的unicode二进制写入硬盘或者基于网络传输时必须将其转换成一种精简的格式,这种格式即utf-8
utf-8是针对Unicode的可变长度字符编码:一个英文字符占1Bytes,一个中文字符占3Bytes,生僻字用更多的Bytes存储
unicode更像是一个过渡版本,我们新开发的软件或文件存入硬盘都采用utf-8格式,等过去几十年,所有老编码的文件都淘汰掉之后,会出现一个令人开心的场景,即硬盘里放的都是utf-8格式,此时unicode便可以退出历史舞台,内存里也改用utf-8,天下重新归于统一
三、结论:
1、内存固定使用unicode,我们可以改变的是存入硬盘采用格式
英文+汉字---->unicode---->gbk
英文+日文---->unicode---->shift-jis
万国字符---->unicode---->utf-8
2、文本文件存取乱码问题
存乱了:解决方法是,编码格式应该设置成支持文件内字符串的格式,否则会造成数据丢失。(损失极大,极其严重)
取乱了:解决方法是,文件是以什么编码格式存如硬盘的,就应该以什么编码格式读入内存。(损失不大,只需修改相对应的格式编码即可)
3、python解释器默认读文件的编码
python3默认:utf-8
python2默认:ASCII
指定文件头修改默认的编码,在py文件的首行写:
# coding:gbk
4、保证运行python程序前两个阶段不乱码的核心法则:
指定文件头 # coding:文件当初存入硬盘时所采用的编码格式
5、 python3的str类型默认直接存成unicode格式,无论如何都不会乱码,保证python2的str类型不乱码。
x=u'上'
6、了解
python2解释器有两种字符串类型:str、unicode
# str类型
x='上' # 字符串值会按照文件头指定的编码格式存入变量值的内存空间
# unicode类型
x=u'上' # 强制存成unicode