python 字符编码
目录
字符编码
字符编码发展史
解码与编码
utf-8
字符编码
人与计算机交互的时候,人输入的是人类能够理解的语言,计算机读入的是计算机能够理解的语言(二进制),
从人能够理解的语言到计算机能够理解的语言,中间必须有一个翻译的过程,翻译的过程中必须有一个参照的标准,
标准称为字符编码表,该表存放的是字符与数字(二进制)的关系。
字符编码的发展史
一家独大
美国最先发明了字符编码,ASCII码。ASCII的特点:
1、表中只有英文和数字的对应关系
2、一个英文字符对应1Bytes,1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符
一家独大到天下纷争
中国:gbk。为了让计算机能够识别中文,中国制定gbk。gbk的特点
1、只有中文字符、英文字符与数字的一一对应关系
2、一个英文字符对应1Bytes 一个中文字符对应2Bytes
补充说明:
1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符
2Bytes=16bit,16bit最多包含65536个数字,可以对应65536个字符,足够表示所有中文字符
统一阶段
Unicode于1990年开始研发,1994年正式公布。特点:
0. Unicode 一个Unicode对应2bytes
1、存在所有语言中的字符与数字一一对应的关系
2、与其他字符编码的二进制存在对应关系
以前的应用软件、系统、语言等采用各种字符编码,这个问题是历史遗留问题。程序、软件等都存放在硬盘中,
启动软件需要将软件从硬盘中加载到内存,软件是由各种不同的字符编码写成,计算机想正常启动软件而不出现乱码
的情况,就需要一个万国兼容的代码,该编码存在与万国的字符编码对应的关系,这是Unicode产生的原因。
编码与解码
编码:
文本编辑器输入的字符存入内存,内存中的数据使用的Unicode,内存中的数据到硬盘中,
由Unicode编码到其他编码(如:GBK)的过程,称为编码(encode)。
解码:
由硬盘中的数据到内存中,也是硬盘中的其他字符编码(如:GBK)到Unicode的过程,称为解码(decode)。
utf-8
定义:针对Unicode的可变长度字符编码
数据保存的过程:万国字符 --->内存Unicode--->硬盘utf-8
Demo:
1. python2和python3使用的字符编码?
Python2:使用的是ASCII码,因为那个时候Unicode还未开发出来
Python3:使用的是utf-8码
2. 为什么硬盘中的数据不直接是Unicode?
占用空间
理论上是可以直接把内存中的Unicode格式存放在硬盘中,但是由于Unicode是使用两个字节表示一个字符,
假如有大量的英文字符存入到硬盘中,使用Unicode格式会占用大量的空间(一倍)
增加写入时间
英文字符存入硬盘中只需要一个字节,而Unicode使用的是两个字节,导致其中一个字节没有存放数据,同时也会消耗数据存入硬盘的时间。
会增加Unicode转换为utf-8的时间?
总结
所以将内存中的unicode二进制写入硬盘或者基于网络传输时必须将其转换成一种精简的格式,
这种格式即utf-8(全称Unicode Transformation Format,即unicode的转换格式)
3. 为什么内存中的数据不直接是utf-8?
utf-8是不定长的:一个英文字符占1Bytes,一个中文字符占3Bytes,生僻字用更多的Bytes存储
假如:用户输入"你y好",在内存中需要先经历计算的过程:“你”应该用3Bytes,“y”应该用1Bytes,“好”应该用3Bytes,然后才能存储,
所以内存中如果直接使用utf-8格式去存储字符,耗费的总时间=计算时间+存储时间,而内存中使用定长的unicode格式存储字符,
就省去了计算时间,所以内存中使用unicode来存储字符会浪费空间,但是会提升速度,这是一种用空间换时间的方法。
3. 如何保证不乱码?
1. 内存中固定使用unicode无论输入任何字符都不会发生乱码
2、我们能够修改的是存/取硬盘的编码方式,如果编码设置不正确将会出现乱码问题。乱码问题分为两种:存乱了,读乱了
2.1 存乱了:如果用户输入的内容中包含中文和日文字符,如果单纯以shift_JIS存,日文可以正常写入硬盘,
而由于中文字符在shift_jis中没有找到对应关系而导致存乱了
2.2 读乱了:如果硬盘中的数据是shift_JIS格式存储的,采GBK格式读入内存就读乱了
4. 数据的传输使用是什么字符编码?
数据的传输使用的是utf-8