Python 编码
ASCII、Unicode、UTF-8 以及 gbk
在具体说明 Python 编码之前,先来理清 ASCII、Unicode、UTF-8、gbk 究竟是什么? 这边仅简单介绍下,具体请百度。
ASCII:是现今最通用的单字节编码系统。ASCII(仅1~127) 仅可代表英文、数字及一些符号等,如,A 的 ASCII 码为65(十进制)。
Unicode:为了解决传统的字符编码方案的局限而产生,为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。犹如其本身的英文含义,Unicode是一种所有符号的编码。Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
UTF-8:是一种针对Unicode的可变长度字符编码,它是Unicode实现的方式之一,是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间,参考如下:
gbk:GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码。
Python3 支持 Unicode
从 Python 3.0 开始所有的字符串都支持 Unicode,默认保存为UTF-8格式;故无须特殊处理,即可正常 print 中文
但 Python3 无 sys.setdefaultencoding()这个函数,故原 Python2 的扩展包要适应这种情况来改写。
Python2 处理 Unicode
Python2 默认源代码文件是 ASCII 编码,故仅仅使用英文、数字的情况下一切正常,但是若使用了中文等,会报错,如下:
为了解决此问题,需要保存为 UTF-8 格式,通常会在 .py 文件头上加上 # -*- coding: utf-8 -*- ,这样,python就会依照utf-8的编码形式解读其中的字符,加上后运行,如下:
这边,直接 print 中文字符串显示为乱码,这是由于python编码与控制台编码的不一致造成的。Windows下控制台中的编码使用的是gbk,而在代码中使用的utf-8,python按照utf-8编码打印到gbk编码的控制台下自然就会不一致而不能打印出正确的汉字。
对此,Python2用来存储文本数据的类型为Unicode 对象,它可以用于存储和维护 Unicode 数据,与现有的字符串对象有良好的集成,必要时提供自动转换。在 Python 中创建 Unicode 字符串和创建普通的字符串一样简单,只需在字符串引号前加 u 即可,如上例中的 u"中文" 。这样处理之后,print 出的中文就不会乱码了。
在Python 3.x版本中,把'xxx'和u'xxx'统一成Unicode编码,即写不写前缀u都是一样的
sys.setdefaultencoding()
Python2,可通过 sys.setdefaultencoding('utf8') 来设置默认encoding方式,注意,一定要增加 reload(sys),原因参考下方引用。
1 #!/usr/bin/env python 2 #encoding: utf-8 3 import sys #引用sys模块进来,并不是进行sys的第一次加载 4 reload(sys) #重新加载sys 5 sys.setdefaultencoding('utf8') #调用setdefaultencoding函数
那么为什么要重新加载,而直接引用过来则不能调用该函数呢?因为setdefaultencoding函数在被系统调用后被删除了,所以通过 import引用进来时其实已经没有了,所以必须reload一次sys模块,这样setdefaultencoding才会为可用,才能在代码里修改解释器当前的字符编码。
在python安装目录的Lib文件夹下,有一个叫site.py的文件,在里面可以找到main() --> setencoding()-->sys.setdefaultencoding(encoding),因为这个site.py每次启动 python解释器时会自动加载,所以main函数每次都会被执行,setdefaultencoding函数一出来就已经被删除了。