字符编码
- 什么是字符编码
字符编码(英语:Character encoding)也称字集码,是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。常见的例子包括将拉丁字母表编码成摩斯电码和ASCII。其中,ASCII将字母、数字和其它符号编号,并用7比特的二进制来表示这个整数。通常会额外使用一个扩充的比特,以便于以1个字节的方式存储。
计算机要想工作必须通电,即用‘电’驱使计算机干活,也就是说‘电’的特性决定了计算机的特性。电的特性即高低电平(人类从逻辑上将二进制数1对应高电平,二进制数0对应低电平),关于磁盘的磁特性也是同样的道理。结论:计算机只认识数字。
很明显,我们平时在使用计算机时,用的都是人类能读懂的字符(用高级语言编程的结果也无非是在文件内写了一堆字符),如何能让计算机读懂人类的字符?
- 内存为什么不用utf8?
只有Unicode编码才能运行其他国家硬盘中的代码,而UTF-8的代码无法进行该操作。
- 乱码的两种情况
存文件时就已经乱码
读文件时乱码
- 涉及到字符编码的两个场景
-
一个Python文件中的内容是由一堆字符组成的,存取均涉及到字符编码问题(Python文件并未执行,前两个阶段均属于该范畴)。
-
Python中的数据类型字符串是由一串字符组成的(Python文件执行时,即第三个阶段)。
- 字符编码的发展史
计算机由美国人发明,最早的字符编码为ASCII,只规定了英文字母数字和一些特殊字符与数字的对应关系。最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号。
ascii用1个字节(8位二进制)代表一个字符;Unicode常用2个字节(16位二进制)代表一个字符,生僻字需要用4个字节。
中国人规定了自己的标准gb2312编码,规定了包含中文在内的字符与数字的对应关系。
键盘 发送的是电流 --> 主机(内存)接收到电流(当作01010101010) --》 显示屏 接收电流(当作01010101010
文本编辑器存储信息的过程文本编辑器 --》 写文本 --》 存储信息显示屏(内存) --》(转换)硬盘
- 总结
- 保证不乱码的核心法则就是,字符按照什么标准而编码的,就要按照什么标准解码,此处的标准指的就是字符编码。
- 在内存中写的所有字符,一视同仁,都是Unicode编码,比如我们打开编辑器,输入一个“你”,我们并不能说“你”就是一个汉字,此时它仅仅只是一个符号,该符号可能很多国家都在使用,根据我们使用的输入法不同这个字的样式可能也不太一样。只有在我们往硬盘保存或者基于网络传输时,才能确定”你“到底是一个汉字,还是一个日本字,这就是Unicode转换成其他编码格式的过程了。简而言之,就是内存中固定使用的就是Uncidoe编码,我们唯一能改变的就是存储到硬盘时使用的编码。
Unicode----->encode(编码)-------->gbk
Unicode<--------decode(解码)<----------gbk
Python2和Python3编码的区别
coding:gbk print('中文‘) # 用gbk写的
python2默认用acill读取字符
python2有两种存储变量的形式,第一种:unicode;第二种:按照coding头来的
假设python2用utf8存储`x='中文'`,当你`print(x)`的时候,终端接收gbk的变量x,但是windows终端编码是utf8,会乱码
假设python2用unicode存储,终端接受的是unicode,windows终端编码是utf8还是gbk重要吗?不会乱码
python3只有一种存储变量的形式,unicode
python3用unicode存储,终端接收的是unicode,widonws终端编码是utf还是gbk不重要,不会乱码
上节课回顾
元组内置方法
不可更改的列表,其他的和列表一模一样
散列表
字典内置方法
- 乱序 --》 python2中字典是乱序的,但是python3做了优化(本来是乱序的,但是在c这个层面做了不乱序的优化)
- key为什么是不可变的,假设key是可变的,
[key]可以取值,也可以修改值
get 获取值,没有默认None
setdefault 有就不修改,没有就增加
集合内置方法
- 去重 --》同样的值存的位置是一样的,拿到第一个就不会拿到第二个
- 乱序 --》插值是按照某种哈希算法随机插的
- 进行数学集合运算
- 交集 &
- 并集 |
- 差集 -
- 补集 ^
add 添加
remove 删除
discard 删除
深浅拷贝
拷贝
l2为l1的拷贝对象,则l1内部的所有数据类型变化,则l2变化
浅拷贝
l2为l1的浅拷贝对象,l1内部的可变数据类型变化,l2变化;l1内部的不可变数据类型变化,l2不变化
深拷贝
l2为l1的深拷贝对象,l1内部变化,l2永不变化。