Python 中的字符编码

文本编辑器存储信息的过程

  1. 打开编辑器就在内存中开辟了一个空间,用编辑器编写的内容暂存在内存中,断电会丢失。

  2. 保存时,编辑器把内存的Unicode数据通过某种编码格式存到了硬盘上。

  3. 编写.py文件(没有执行时)和编写其他文件没有区别,只是在写一堆字符。

python解释器解释python代码的流程

  1. python解释器启动,相当于启动了一个文本编辑器。

  2. python解释器相当于文本编辑器,打开test.py文件,从硬盘将test.py文件通过某种编码格式(gbk,utf8等)解码数据从硬盘读入到内存中(python的解释性决定了解释器只关心文件的内容,不关心文件的后缀)。

  3. python解释器解释执行加载到内存中的test.py代码。在该阶段才会识别python语法,为变量值等开辟存储空间。

Python2和Python3的区别

  1. python2有两种存储形式,第一种:Unicode;第二种:按coding头选择存储格式,假设python2用utf8存储 x=’中文’,当你print(x)的时候,终端接收gbk的变量x,但是windows终端编码是utf8,会乱码。Python3 默认存储形式为utf-8。

  2. 字符串类型:Python2 unicode 和 str类型(gbk、utf-8、MP4、MP3、JPG);Python3 str(Unicode字符串)和bytes类型((gbk、utf-8、MP4、MP3、JPG))。

  3. python3只有Unicode一种存储变量的形式。Python2中默认使用ascii,Python3中默认使用utf-8,部分文本编辑器编写的文件默认为gbk编码格式,需要注意编写代码时文本编辑器的默认编码格式。

  4. Python2 解释器编码默认为ASCII,只能处理 ascii字符,如果代码中有中文会报错,所以需要在代码顶部添加下面一行声明,将代码文件编码声明修改为 utf-8。Python3 解释器默认编码为utf-8;可通过 sys.getdefaultencoding() 查询。

    # -*- coding:utf-8 -*-
    print(u"测试中文打印".encode("gbk"))

文件编码

当字符串第一次写入文件时,文件创建成功,文件编码和字符串编码保持一致。如果后续写入其他编码的字符串,则文件编码会被修改,原来的数据会出现乱码。

总结

  1. python bytes 也称字节序列,并非字符。取值范围 0 <= bytes <= 255,输出的时候最前面会有字符b修饰;string 是python中字符串类型;

  2. bytes主要是给在计算机看的,string主要是给人看的;string经过编码encode,转化成二进制对象,给计算机识别;bytes经过解码decode,转化成string,让我们看,但是注意反编码的编码规则是有范围,\xc8就不是utf8识别的范围;

  3. 内存中固定使用Unicode编码,我们只能改变存储到硬盘时使用的编码格式。读文件时,读取文件采用的编码格式与文本原来的编码格式不同则会导致出现乱码。需注意文本编辑器的编码格式,这能直接影响编译器是否能正确编译程序文本文件。同时也要注意控制台的编码格式,其中Windows 默认的编码格式为gbk,因此某些字符需要转码后打印在控制台才不会是乱码:

    # -*- coding:utf-8 -*-
    print(u"测试中文打印".encode("gbk"))
    print(unicode("测试中文打印","utf-8").encode("gbk"))
  4. 任何语言、任何操作系统、任何编码,都可以和Unicode编码通过decode()和encode()的方式互相转换。

参考

1.Python的字符编码问题
2.bytes()内建函数