转载

关于python的编解码(decode, encode)

总结总结,本文仅适用于python2.x

默认编码与开头声明

首先是开头的地方声明编码

# coding: utf8

这个东西的用处是声明文件编码为utf8(要写在前两行内),不然文件里如果有中文,比如

a = '美丽' b = u'美丽'

中任何一种,运行前就会提示你 SyntaxError ,Non-ASCII character... 之类,因为python2.x的文件编码默认使用万恶的 ascii
开头加上那句默认编码声明就会变成 utf8 ,获取当前的默认编码

sys.getdefaultencoding()

unicode与utf8

在python中,使用unicode类型作为编码的基础类型,编解码要以其为中间形式过渡,即进行 strunicode 之间的转换。

解码然后再编码的过程,即 str -> unicode -> str 的过程。中间得到的叫做unicode 对象

这里需要强调的是 unicode 是一种字符编码方法,是 “与存储无关的表示”,而 utf8 是一种以 unicode 进行编码的计算机二进制表示,或者说传输规范。 gbkgb2312gb18030 , utf8 等属于不同的字符集,转换编码就是在它们中的任意两者间进行。

具体过程

具体的转换,比如直接将一个字符串encode成另一种字符集表示,注意此处是字符串,即 typestr 的,引号前没有加 u 前缀的

# coding: utf8  s='美丽' s.encode('gbk')

则实际上会先以默认编码进行 decode ,即 decode('ascii') ,开头声明了utf8, s 的编码就是 utf8 ,ascii解码不了 utf8 的字符会报错。那就改默认编码,

# coding: utf8 import sys  reload(sys) sys.setdefaultencoding('utf-8')  s='美丽' s.encode('gbk')

这样把默认编码改成utf8, decode 的时候就以默认编码 utf8 来进行,能够成功运行

或者 decode 时指定类型,

# coding: utf8 import sys  s='美丽' s.decode('utf8').encode('gbk')

对于 typeunicode 的,即加了 u 前缀的字符串,如上所说,直接 encode 即可

# coding: utf8 import sys  s = u'美丽' s.encode('gbk')

控制台的编码

这又是另一个让人困惑的地方——控制台的编码导致的乱码问题甚至是报错。一般个人用的电脑上控制台基本上都是 utf8 编码的,但运维的机器上基本全是 ascii ,print中文的时候就会有酸爽的问题。乱码问题一般发生在 windows 下面,因为那个编码的字符集很与众不同。所以当以

正确

方式编解码以后,还是出现问题,那问题很可能就出在控制台上了

正文到此结束
Loading...