一、Python 2 字符编码
1、python 2的编码方式
在python 2 中默认使用ASCII编码,一般情况下我们编写python脚本时,使用的都是utf-8编码。但是python2解释器解析python文本时默认采用ASCII编码,如果脚本中涉及到中文(包括注释),python2执行时都会报错。解决方式是,在脚本第一行添加声明,使用utf-8编码,解释器在执行时就会以utf-8的编码方式去解析脚本。
#-*- encoding:utf-8 -*-
2、python2 字符串类型
Python中有两种字符串类型,分别是str和unicode,str字符串其实是字节组成的序列,unicode字符串则表示为unicode类型的实例,可视为字符的序列(对应C语言里真正的字符串)。Python内部以16比特或32比特的整数表示Unicode字符串,这取决于Python解释器的编译方式。
在python中没有特别指定时,字符串默认类型是str,在字符串前加u表示unicode类型
2.1、unicode
unicode(string[, encoding, errors])函数可根据指定的encoding将string字节序列转换为Unicode字符串。若未指定encoding参数,则默认使用ASCII编码(大于127的字符将被视为错误)。
2.2、encode与decode
(1)、encode([encoding], [errors=‘strict’])
可根据指定的encoding将Unicode字符串转换为字节序列。若未指定encoding参数,则默认使用ASCII编码(大于127的字符将被视为错误)。
#-*- encoding:utf-8 -*-
import sys
import json
reload(sys)
sys.setdefaultencoding('utf-8')
str=u"编码方式"
print(type(str)) #<type 'unicode'>
print(type(str.encode())) #<type 'str'>
(2)、decode([encoding], [errors])
根据指定的encoding将字节序列转换为Unicode字符串,即使用该编码方式解释字节序列。若未指定encoding参数,则默认使用ASCII编码(大于127的字符将被视为错误)。unicode(str, encoding)与
str.decode(encoding)效果等同。
#-*- encoding:utf-8 -*-
import sys
import json
reload(sys)
sys.setdefaultencoding('utf-8')
str="编码方式"
print(type(str)) #<type 'str'>
print(type(str.decode())) #<type 'unicode'>
(3)、编码的过程
对一个中文字符串,进行编码,会报编码错误,试图将一个非ASCII码字符解码为ASCII
#-*- encoding:utf-8 -*-
str="编码方式" # str类型
str=str.encode('utf8') # 实际等同于str=str.decode('ascii').encode('utf8')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 0: ordinal not in range(128)
这是由于使用encode对str类型字符串进行编码时,python会先进行解码得到unicode类型,然后再进行编码,默认的解码方式的ASCII码,对于大于127的字符无法解析,因此会报错。
解决方式:
方式1:sys.setdefaultencoding(‘utf-8’)
指定encode与decode的默认编码方式
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
#指定默认编码放
方式2:调用encode之前,先主动decode
str=str.decode('utf-8').encode('utf8')