一 了解字符编码的知识储备
1.计算机基础知识
2.电脑存放组成:
硬盘 - 内存 -(二级缓存、一级缓存、cpu寄存器)- cpu
# cpu交互的是用户能识别的数据:字符
# 硬盘中最终存储的数据:0,1的二进制数据(可以直接转化为电脑能识别的高低电频)
3.文本编辑器存取文件的原理(nodepad++,pycharm,word)
#1、打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的内容也都是存放与内存中的,断电后数据丢失 #2、要想永久保存,需要点击保存按钮:编辑器把内存的数据刷到了硬盘上。 #3、在我们编写一个py文件(没有执行),跟编写其他文件没有任何区别,都只是在编写一堆字符而已
4.python解释器执行py文件的原理 ,例如python test.py
#第一阶段:python解释器启动,此时就相当于启动了一个文本编辑器 #第二阶段:python解释器相当于文本编辑器,去打开test.py文件,从硬盘上将test.py的文件内容读入到内存中(小复习:pyhon的解释性,决定了解释器只关心文件内容,不关心文件后缀名) #第三阶段:python解释器解释执行刚刚加载到内存中test.py的代码( ps:在该阶段,即真正执行代码时,才会识别python的语法,执行文件内代码,当执行到name="egon"时,会开辟内存空间存放字符串"egon")
5.总结python解释器与文件本编辑的异同
#1、相同点:python解释器是解释执行文件内容的,因而python解释器具备读py文件的功能,这一点与文本编辑器一样 #2、不同点:文本编辑器将文件内容读入内存后,是为了显示或者编辑,根本不去理会python的语法,而python解释器将文件内容读入内存后,可不是为了给你瞅一眼python代码写的啥,而是为了执行python代码、会识别python语法。
二、字符编码介绍
1. 什么是字符编码
计算机要想工作必须通电,即用‘电’驱使计算机干活,也就是说‘电’的特性决定了计算机的特性。电的特性即高低电平(人类从逻辑上将二进制数1对应高电平,二进制数0对应低电平),关于磁盘的磁特性也是同样的道理。结论:计算机只认识数字 很明显,我们平时在使用计算机时,用的都是人类能读懂的字符(用高级语言编程的结果也无非是在文件内写了一堆字符),如何能让计算机读懂人类的字符? 必须经过一个过程: #字符--------(翻译过程)------->数字 #这个过程实际就是一个字符如何对应一个特定数字的标准,这个标准称之为字符编码
# 字符编码:将人识别的字符转换计算机能识别的01,转换的规则就是字符编码表
2.涉及到字符编码的问题
#1、一个python文件中的内容是由一堆字符组成的,存取均涉及到字符编码问题(python文件并未执行,前两个阶段均属于该范畴) #2、python中的数据类型字符串是由一串字符组成的(python文件执行时,即第三个阶段)
3.字符编码的发展史与分类
计算机由美国人发明,最早的字符编码为ASCII,只规定了英文字母数字和一些特殊字符与数字的对应关系。
最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号
当然我们编程语言都用英文没问题,ASCII够用,但是在处理数据时,不同的国家有不同的语言,日本人会在自己的程序中加入日文,中国人会加入中文。
而要表示中文,单拿一个字节表表示一个汉子,是不可能表达完的(连小学生都认识两千多个汉字),解决方法只有一个,就是一个字节用>8位2进制代表,位数越多,代表的变化就多,这样,就可以尽可能多的表达出不通的汉字
所以中国人规定了自己的标准gb2312编码,规定了包含中文在内的字符->数字的对应关系。
日本人规定了自己的Shift_JIS编码
韩国人规定了自己的Euc-kr编码
# 最早期对应关系:ascii编码表 - 存放的是英文数字与机器二进制的对应关系 # 数字70对应ascii表,指向的是字母'F' print(chr(70)) # 'F' print(ord('f')) # 102 # 字符所占字节数 # 1字节 = 8个二进制位 00000000 ~ 11111111 256个数字 -128 ~ 127 # 中文 # GBK: 16个二进制位 15个0到15个1 # 兼容ascii,一个字母或数字占一个字节 # 2w多汉字,用两个字节进行存储 # 国际上交流: # 一条信息中,可能同时出现英文/中文/日文/韩文,将所有信息存储,且不乱码 # 万国编码表:unicode # unicode采用两个字节存放数据:utf-8,utf-16 # utf-8采用变长存储:1字节存放数字与英文,3字节存放汉字 # utf-16采用定长存储:均以2字节存放数字,英文,汉字 # 内存中用utf-16存取数据:定长存取效率高(变长需要计算后才存取) # cpu中与硬盘中,采用utf-8存放数据(utf-8传输更快)
4.总结字符编码的发展可分为三个阶段
#阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit,8bit可以表示0-2**8-1种变化,即可以表示256个字符 ASCII最初只用了后七位,127个数字,已经完全能够代表键盘上所有的字符了(英文字符/键盘的所有其他字符),后来为了将拉丁文也编码进了ASCII表,将最高位也占用了 #阶段二:为了满足中文和英文,中国人定制了GBK GBK:2Bytes代表一个中文字符,1Bytes表示一个英文字符 为了满足其他国家,各个国家纷纷定制了自己的编码 日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里 #阶段三:各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。如何解决这个问题呢???#1、能够兼容万国字符 #2、与全世界所有的字符编码都有映射关系,这样就可以转换成任意国家的字符编码 # 总结:内存中统一采用unicode,浪费空间来换取可以转换成任意编码(不乱码),硬盘可以采用各种编码,如utf-8,保证存放于硬盘或者基于网络传输的数据量很小,提高传输效率与稳定性。
6.字符编码总结
# 1、但凡出现乱码问题,一定是编码时用了一套字符编码,解码时用了另一套字符编码 # 2、解决乱码问题核心:编码时用什么编码存,解码时就用什么编码解 # 3、python3解释器默认使用utf-8 Python2解释器默认使用ASCII # 4、文件开头:#coding:gbk 用来告诉解释器读文件内容时,用什么编码 # 5、Python3中str类型内存用的是Unicode编码的二级制
三、字符编码转换
# 原文本字符串数据 # s1 = 'abc123你好' s1 = u'abc123你好' print(s1) # 二进制字符串数据: 数据传输是以字节为单位,要将原文字符串转换为二进制字符串机械能传输 # 编码 res = s1.encode('utf-8') print(res) # 解码 s2 = res.decode('utf-8') print(s2) ss2 = b'abc123\xe4\xbd\xa0\xe5\xa5\xbd\xe5\xa5\xbd\xe5\xa5\xbd' print('>>', ss2.decode('utf-8')) # 原义字符串数据 s3 = r'你好\n好的' print(s3) # s4 = 'D:\\nbpython\\day03\\代码\\4.三种字符串.py' # print(s4) s4 = r'D:\nbpython\day03\代码\4.三种字符串.py' print(s4)