python编码
python编码简介
字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
-
decode
的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312')
,表示将gb2312编码的字符串str1转换成unicode编码。 -
encode
的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312')
,表示将unicode编码的字符串str2转换成gb2312编码。
# -*- coding=gb2312 -*-
a = u"中文"
a_gb2312 = a.encode('gb2312')
print a_gb2312
a_unicode = a_gb2312.decode('gb2312')
# 或者采用unicode(a_gb2312, 'gb2312')
assert(a_unicode == a)
a_utf_8 = a_unicode.encode('utf-8')
print a_utf_8
因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码.
代码中字符串的默认编码与代码文件本身的编码一致。如:s='中文'
, 如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。这种情况下,要进行编码转换,都需要先用decode
方法将其转换成unicode编码,再使用encode
方法将其转换成其他编码。通常,在没有指定特定的编码方式时,都是使用的系统默认编码创建的代码文件。
提示: 编写python代码,需要在文件的头部加上
coding=utf-8
. python支持# -*- coding=utf-8 -*-
和coding=utf-8
两种写法,效果相同,前者是多数语言的写法,后者是python支持的的简洁写法。
如果字符串是这样定义:s=u'中文'
, 则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关。因此,对于这种情况做编码转换,只需要直接使用encode方法将其转换成指定编码即可。
如果一个字符串已经是unicode了,再进行解码则将出错。用非unicode编码形式的str来encode
也会报错。因此通常要对其编码方式是否为unicode进行判断:
isinstance(s, str) # 用来判断是否为一般字符串
isinstance(s, unicode) #用来判断是否为unicode
编码间的区别
主要介绍python的编码机制,unicode, utf-8, utf-16, GBK, GB2312, ISO-8859-1等编码之间的区别。
GBK与GB2312的区别
GB码,全称是GB2312-80《信息交换用汉字编码字符集基本集》,1980年发布,是中文信息处理的国家标准,在大陆及海外使用简体中文的地区(如新加坡等)是强制使用的唯一中文编码。Windows3.2和苹果OS就是以GB2312为基本汉字编码,Windows95/98则以GBK为基本汉字编码、但兼容支持GB2312。GB码共收录6763个简体汉字、682个符号,其中汉字部分:一级字3755,以拼音排序,二级字3008,以偏旁排序。该标准的制定和应用为规范、推动中文信息化进程起了很大作用。
GBK编码是中国大陆制订的、等同于UCS的新的中文编码扩展国家标准。GBK工作小组于1995年10月,同年12月完成GBK规范。该编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。
GBK包括GB2312的所有编码,有些字GB2312没有,需要用GBK来编码。
其它编码(utf-8,GBK)转换为unicode
unicode与其它编码之间的区别
为什么不所有的文件都使用unicode,还要用GBK,utf-8等编码呢?
unicode可以称为抽象编码,也就是它只是一种内部表示,一般不能直接保存。
保存到磁盘上时,需要把它转换为对应的编码,如utf-8和utf-16。
除上以上的编码方法,在读写文件时还可以使用codecs的open方法在读写时进行转换。
系统编码的获取和设置
获取系统编码,该段程序在英文WindowsXP上输出为:ascii
:
# coding=utf-8
import sys
print(sys.getdefaultencoding())
也可以用python自带的模块locale来检测命令行默认编码和设置命令行编码:
import locale
#get
locale.getdefaultlocale()
#('zh_CN', 'cp936')
#set
locale.setlocale(...)
编码错误
IDE中编码错误
在某些IDE中,字符串的输出总是出现乱码,甚至错误,其实是由于IDE的结果输出控制台自身不能显示字符串的编码,而不是程序本身的问题。 如在UliPad中运行如下代码:
s=u"中文"
print s
# 显示如下
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
这是因为UliPad在英文WindowsXP上的控制台信息输出窗口是按照ascii编码输出的(英文系统的默认编码是ascii),而上面代码中的字符串是Unicode编码的,所以输出时产生了错误。
将最后一句改为:print s.encode('gb2312')
, 则能正确输出“中文”两个字。
若最后一句改为:print s.encode('utf8')
, 则输出:\xe4\xb8\xad\xe6\x96\x87
,这是控制台信息输出窗口按照ascii编码输出utf8编码的字符串的结果。
unicode(str,'gb2312')与str.decode('gb2312')是一样的,都是将gb2312编码的str转为unicode编码. 使用str.class可以查看str的编码形式.
python中sys
模块原本有setdefaultencoding
函数,但在启动脚本setting.py
中被删除了,可以通过reload(sys)
启用,这样可以解决编码问题:
import sys
if sys.getdefaultencoding() != 'utf-8':
reload(sys)
sys.setdefaultencoding('utf-8')
常见的错误有setuptools, pip, install, UnicodeDecodeError: 'ascii' codec can't decode byte.
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 1: ordinal not in range(128)
Something went wrong during the installation.
See the error message above.
原因与注册表有关,可能与某些国产软件对注册表的改写的gbk格式导致python无法进行第三方库的安装操作。
解决方法:打开C:\Python27\Lib
下的mimetypes.py
文件,找到大概256行(你可以用Notepad++的搜索功能):default_encoding = sys.getdefaultencoding()
。
在这行前面添加三行:
if sys.getdefaultencoding() != 'gbk':
reload(sys)
sys.setdefaultencoding('gbk')
default_encoding = sys.getdefaultencoding()
保存,就解决问题了。