编码 编码的转化
什么是字符编码
因为计算机是外国人创造的所以计算机最开始只能识别最开始的基本数字(毕竟是外国人创造的所以最开始是不支持伟大的汉语 ,所以everybody努力学习吧 创造 我们自己的伟大的技术)
计算机要想工作必须通电,也就是说‘电’驱使计算机干活,而‘电’的特性,就是高低电平(高低平即二进制数1,低电平即二进制数0),也就是说计算机只认识数字
很明显,我们平时在使用计算机时,用的都是人类能读懂的字符(用高级语言编程的结果也无非是在文件内写了一堆字符),如何能让计算机读懂人类的字符?
必须经过一个过程:
字符--------(翻译过程)------->数字
这个过程实际就是一个字符如何对应一个特定数字的标准,这个标准称之为字符编码
以下两个场景下涉及到字符编码的问题:
1:一个python文件中的内容是由一堆字符组成的(python文件未执行的时候)
2:python 中的数据类型,字符串是由一串字符组成的(python文件执行的时候)
字符编码的发展史
阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII
ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit,8bit可以表示0-2**8-1种变化,即可以表示256个字符
ASCII最初只用了后七位,127个数字,已经完全能够代表键盘上所有的字符了(英文字符/键盘的所有其他字符)
后来为了将拉丁文也编码进了ASCII表,将最高位也占用了
阶段二:为了满足中文,中国人定制了GBK
GBK:2Bytes代表一个字符
为了满足其他国家,各个国家纷纷定制了自己的编码
日本把日文编到Shift_JIS
里,韩国把韩文编到Euc-kr
里
阶段三:各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。
unique:对于python2各字节一个字符 python3就是4位一个字符
于是产生了unicode, 前期统一用2Bytes代表一个字符, 2**16-1=65535,可代表6万多个字符, 后期使用4各字节代表一个字符因而兼容万国语言
但对于通篇都是英文的文本来说,这种编码方式无疑是多了一倍的存储空间(二进制最终都是以电或者磁的方式存储到存储介质中的)
于是产生了UTF-8,对英文字符只用1Bytes表示,对中文字符用3Bytes
需要强调的一点是:
unicode:简单粗暴,所有字符都是4Bytes,优点是字符->数字的转换速度快,缺点是占用空间大
utf-8:精准,对不同的字符用不同的长度表示,优点是节省空间,缺点是:字符->数字的转换速度慢,因为每次都需要计算出字符需要多长的Bytes才能够准确表示
在python3 中str的类型是unicode(万国码)如果str'想要显示出来 必须是要转化的 那么我们需要把str转化为非unicode类型(bytes)的
字符串在python3中就是默认为unicode的形式的 所以我们必须转化bytes才能显示出来 就好比你发送一段python代码 那么里面的字符串 你要先转化为Unicode类型的 python解释器才能 识别发送 然后接收后 为了显示出来那么 python解释器再编码成非Unicode类型的 才能显示出来 这就是编码的过程 我们编码需要用encode
>>> s= 'alex' >>> sl = s.encode('utf-8') #编码 str-->bytes >>> s= 'hello girl' sl = s.encode('utf-8') #str----->utf-8 print(sl)
如果我们想要把非Unicode类型的先转化为Unicode 那么用decode
如果一个utf-8要转换为gbk不能直接转化 需要用decode先转换成unicode 然后再用encode转换为gbk
s = 'alex' s1 = s.encode('gbk') # 转化为gbk s2 = s1.decode('gbk') # gbk转化为unicode s = s2.encode('utf-8') # unicode 转化为utf-8 print(s.decode('UTF-8')) # 然后解码转化为Unicode 因为计算机只是别unicode所以必须转化为unicode类型的才能显示
计算机所显示的所有文字 数字都是unicode类型的 传输的时候必须要线转码,转为可以传输的字节码才能和电信号交互进行传递