关于python的编解码(decode, encode)
梳理 Python 2 中源码编码、Unicode、UTF-8、encode、decode 与终端编码之间的关系。
总结总结,本文仅适用于python2.x
默认编码与开头声明
首先是开头的地方声明编码
coding: utf8
这个东西的用处是声明文件编码为utf8(要写在前两行内),不然文件里如果有中文,比如
a = '美丽'b = u'美丽'中任何一种,运行前就会提示你SyntaxError,Non-ASCII character… 之类,因为python2.x的文件编码默认使用万恶的ascii
开头加上那句默认编码声明就会变成utf8,获取当前的默认编码
sys.getdefaultencoding()unicode与utf8
在python中,使用unicode类型作为编码的基础类型,编解码要以其为中间形式过渡,即进行str和unicode之间的转换。
解码然后再编码的过程,即str->unicode->str的过程。中间得到的叫做unicode对象
这里需要强调的是unicode是一种字符编码方法,是 “与存储无关的表示”,而utf8是一种以unicode进行编码的计算机二进制表示,或者说传输规范。gbk,gb2312,gb18030, utf8等属于不同的字符集,转换编码就是在它们中的任意两者间进行。
具体过程
具体的转换,比如直接将一个字符串encode成另一种字符集表示,注意此处是字符串,即type为str的,引号前没有加u前缀的
# coding: utf8
s='美丽's.encode('gbk')则实际上会先以默认编码进行decode,即decode('ascii'),开头声明了utf8,s的编码就是utf8,ascii解码不了utf8的字符会报错。那就改默认编码,
# coding: utf8import sys
reload(sys)sys.setdefaultencoding('utf-8')
s='美丽's.encode('gbk')这样把默认编码改成utf8,decode的时候就以默认编码utf8来进行,能够成功运行
或者decode时指定类型,
# coding: utf8import sys
s='美丽's.decode('utf8').encode('gbk')对于type为unicode的,即加了u前缀的字符串,如上所说,直接encode即可
# coding: utf8import sys
s = u'美丽's.encode('gbk')控制台的编码
这又是另一个让人困惑的地方——控制台的编码导致的乱码问题甚至是报错。一般个人用的电脑上控制台基本上都是utf8编码的,但运维的机器上基本全是ascii,print中文的时候就会有酸爽的问题。乱码问题一般发生在windows下面,因为那个编码的字符集很与众不同。所以当以正确方式编解码以后,还是出现问题,那问题很可能就出在控制台上了