字符编码
-
前置知识点
1.程序执行的三大核心硬件:
CPU
内存
硬盘
正常执行一个程序的要点:
1、将硬盘中的数据读到内存
2、由CPU读内存中的数据进行执行
3、在执行程序的时候,生成的数据,优先存入内存
2.python解释器执行一个py文件的过程:
如果没有python解释器,py文件单纯就是一个文本文件,所以,想执行py文件,必须先执行python解释器
1.将python解释器的代码由硬盘读到内存
2.将py文件以普通文本文件的格式由硬盘读到内存
3.python解释器去内存中读取py文件的数据
4.识别python语法,执行相应的操作
python解释器和文本文件编辑器的区别:
1.相同点:前两个阶段二者完全一致,都将硬盘中文件的内容读到内存
2.不同点:文本编辑器将文件内容读到内存后,是为了显示或者编辑,根本不会理会python的用法,但是python解释器将文件内容读到内存后,是为了执行python代码、会识别python语法
-
字符编码:
字符:世界上一切语言、文字
有必要考虑,图片文件、音频文件、视频文件?
文件的输入和输出是两个过程
人类输入的内容都是人类自己可以识别的字符
计算机只能识别二进制字符(101010)
将人类的字符,存入内存和硬盘,要经理一个过程:
人类的字符>>>翻译(字符编码表)>>>计算机二进制
-
字符编码表:
-
ASCII码表(美国)
计算机起源于美国,所以最先考虑的是让计算机识别英文字符,于是诞生了ASCII表
- 只有英文字符与数字的一一对应关系
- 用八位二进制来代表一个英文字符,一个英文字符对应1Bytes,1Bytes=8bit,8bit最多包含256个数字,对应256个字符足够表示所有英文字符
-
GBK表(中国)
为了让计算机能够识别中文和英文,中国人定制了GBK
-
只有中文字符、英文字符与数字的一一对应关系
-
一个英文字符对应1Bytes
一个中文字符对应2Bytes
补充:
1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符
2Bytes=16bit,16bit最多包含65536个数字,可以对应65536个字符,足够表示所有中文字符
-
-
Unicode(万国符)
为了兼容所有的国家的字符,生成Unicode
- 存在所有语言中的所有字符与数字的一一对应关系
- 与传统的字符编码的二进制数都有对应关系
- 占用存储空间
- IO次数增加,程序运行速度变慢(最致命)
在Unicode二进制数据存入硬盘的时候,做优化
Unicode与其他编码有相应的映射/转换关系:
文本编辑器输入任何字符都市最新存在于内存中,是Unicode编码的,存放于硬盘中,则可以转换成任意其他编码,只要该编码可以支持相应的字符
-
编码与解码
- 编码(encode):由字符转换成内存中的Unicode,以及由Unicode转换成其他编码的过程,都成为编码encode
- 解码(decode):由内存中的Unicode转换成字符,以及由其他编码转换成Unicode的过程,都成为解码decode
在诸多文件类型中,只有文本文件的内存是由字符组成的,因而文本文件的存取也涉及到字符编码的问题
- utf-8:全称:Unicode Transformation Format,即Unicode的转换格式
- utf-8只与Unicode由对应关系
- 所有的英文字符用1个bytes表示
- 所有的中文字符用3个btes表示
现在的计算机:
内存都是:Unicode
硬盘都是:utf-8
数据传输:
优先以自己的本国字符编码进行传递
1.用户无论输入什么字符,存入内存,Unicode都可以兼容
2.硬盘中无论是什么编码类型的文件,读到内存,都可以兼容Unicode
Unicode二进制字符(内存)>>>编码(encode)>>>utf-8二进制字符(硬盘)
utf-8二进制字符(硬盘)>>>解码(decode)>>>Unicode二进制字符(内存)
保证不乱码的核心就是:用什么编码存的数据,就用什么编码取
补充:
python2:
默认字符编码是ASCII码(因为当时的Unicode还没有盛行)
python3:
默认的字符编码是utf-8
文件头:
# coding:utf-8
告诉你的计算机,你的这个文件是用什么编码写的
用英文字符,是为了让所有计算机都可以识别
pycharm默认的字符编码是:utf-8
Windows默认的字符编码是:GBK