字符编码

  • 什么是字符编码

字符编码(英语:Character encoding)也称字集码,是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。常见的例子包括将拉丁字母表编码成摩斯电码和ASCII。其中,ASCII将字母、数字和其它符号编号,并用7比特的二进制来表示这个整数。通常会额外使用一个扩充的比特,以便于以1个字节的方式存储。

计算机要想工作必须通电,即用‘电’驱使计算机干活,也就是说‘电’的特性决定了计算机的特性。电的特性即高低电平(人类从逻辑上将二进制数1对应高电平,二进制数0对应低电平),关于磁盘的磁特性也是同样的道理。结论:计算机只认识数字。

很明显,我们平时在使用计算机时,用的都是人类能读懂的字符(用高级语言编程的结果也无非是在文件内写了一堆字符),如何能让计算机读懂人类的字符?

  • 内存为什么不用utf8?

​ 只有Unicode编码才能运行其他国家硬盘中的代码,而UTF-8的代码无法进行该操作。

  • 乱码的两种情况

​ 存文件时就已经乱码

​ 读文件时乱码

  • 涉及到字符编码的两个场景
  1. 一个Python文件中的内容是由一堆字符组成的,存取均涉及到字符编码问题(Python文件并未执行,前两个阶段均属于该范畴)。

  2. Python中的数据类型字符串是由一串字符组成的(Python文件执行时,即第三个阶段)。

  • 字符编码的发展史

​ 计算机由美国人发明,最早的字符编码为ASCII,只规定了英文字母数字和一些特殊字符与数字的对应关系。最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号。

​ ascii用1个字节(8位二进制)代表一个字符;Unicode常用2个字节(16位二进制)代表一个字符,生僻字需要用4个字节。

​ 中国人规定了自己的标准gb2312编码,规定了包含中文在内的字符与数字的对应关系。

​ 键盘 发送的是电流 --> 主机(内存)接收到电流(当作01010101010) --》 显示屏 接收电流(当作01010101010

​ 文本编辑器存储信息的过程文本编辑器 --》 写文本 --》 存储信息显示屏(内存) --》(转换)硬盘

  • 总结
  1. 保证不乱码的核心法则就是,字符按照什么标准而编码的,就要按照什么标准解码,此处的标准指的就是字符编码。
  2. 在内存中写的所有字符,一视同仁,都是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不重要,不会乱码

上节课回顾

元组内置方法
不可更改的列表,其他的和列表一模一样

散列表

字典内置方法

  1. 乱序 --》 python2中字典是乱序的,但是python3做了优化(本来是乱序的,但是在c这个层面做了不乱序的优化)
  2. key为什么是不可变的,假设key是可变的,

[key]可以取值,也可以修改值

get 获取值,没有默认None

setdefault 有就不修改,没有就增加

集合内置方法

  1. 去重 --》同样的值存的位置是一样的,拿到第一个就不会拿到第二个
  2. 乱序 --》插值是按照某种哈希算法随机插的
  3. 进行数学集合运算
    1. 交集 &
    2. 并集 |
    3. 差集 -
    4. 补集 ^

add 添加

remove 删除

discard 删除

深浅拷贝

拷贝

l2为l1的拷贝对象,则l1内部的所有数据类型变化,则l2变化

浅拷贝

l2为l1的浅拷贝对象,l1内部的可变数据类型变化,l2变化;l1内部的不可变数据类型变化,l2不变化

深拷贝

l2为l1的深拷贝对象,l1内部变化,l2永不变化。