字符编码
Python3特性预览
文本总是用unicode进行编码,以str类型表示;而二进制数据以bytes类型表示
Python3中最重要的特性将文本(text)和二进制数据做了更清晰的区分
不能以任何隐式方式将str和bytes类型混合使用
不可以将str和bytes类型进行拼接
不能在str中搜索bytes数据(反之亦然)
不能将str作为参数传入需要bytes类型参数的函数(反之亦然)
strings可以被编码(encode)成bytes,bytes也可以解码(decode)成strings

可以这样理解:
字符串(string)是文本(text)的抽象表示,字符串(string)由字符组成,字符也是抽象的实体且与任何二进制表示无关。当操纵字符串的时候,很多细节是不用了解的,我们可以分割、切片和拼接字符串,在字符串内部进行搜索。但并不在乎内部是如何表示的,也不用在意底层一个字符要花费多少byte。
传入encode和decode的参数是编码方式。编码是一种用二进制数据表示抽象字符的方式。目前有很多种编码。上面给出的utf-8是一种,下面是另一种:
编码是这个转换过程中至关重要的一部分。若不编码,bytes对象b'xa420'只是一堆比特位而已。编码赋予其含义。采用不同的编码,这堆比特位的含义就会大不同:
附:原文链接
字符编码详解

文本编辑器包括Pycharm编写的内容是存在内存中的,断电后丢失;
想要永久保存,需要点击保存按钮 save,把内存中数据刷到硬盘上;
保存save时用二进制的0 1比特存储内存数据,涉及编码,编辑器可指定默认编码;
Python解释器先类似编辑器读取read功能,还原硬盘中数据到内存中,涉及编码,和save时一致就行
Python解释器执行加载到内存中的数据,识别Python语法,有数据类型的变量,如list,dict,str
Python解释器执行到name="Linda"时,会开辟空间存储字符串"Linda",会涉及编码
所以在 保存 - 读取 阶段不乱码的核心法则是:字符保存时按照什么标准编码,读取时就按照什么标准解码
在解释器执行阶段,数据已经正常读取到内存中(统一unicode编码),然后执行,执行过程中会开辟新的空间,如 x = "Linda"
Python2中有两种字符串类型str和unicode
str类型
当python解释器执行到产生字符串的代码时(如x='上'),会申请新的内存地址,然后将'上'编码成文件开头指定的编码格式,想看x在内存中的真实格式,可以将其放入列表中再打印,而不要直接打印,直接print会自动转码
unicode类型
当python解释器执行到产生字符串的代码时(如x=u'上'),会申请新的内存地址,然后将'上'已unicode的格式存放到新的内存空间中,所以x只能encode,不能decode
打印到终端
python刚诞生之际,unicode编码还没有统一,所以str是bytes类型,python3直接str为unicode
python3也有两种字符串类型str和bytes
看到python3中x.encode('gbk')的结果'\xc9\xcf'正是python2中的str类型的值, 而在python3是bytes类型,
在python2中则是str类型,python2中的str类型就是python3的bytes类型
附:原文链接
字符编码实践
Last updated