在Python中使用encode()函数运用指定的编码方式对字符串进行编码。
关于编码的有关知识,本站在《Python中的Unicode编码格式》一文中进行了详细介绍,读者可以通过这篇文章了解有关字符串编码的问题。
在Python中,每个字符串对象都有encode()函数,该函数将按照用户指定的编码方式(如UTF-8,UTF-16等)对字符串对象进行编码,编码后返回字符串的字节(Bytes)对象,如未指定编码格式,该函数默认使用“utf-8”编码方式。
该函数的语法格式如下所示:
str.encode(encoding = "utf-8", errors = "strict")
语法中,str是待编码的字符串对象。encoding参数给出编码方式,默认为“utf-8”,errors 参数给出编码失败时的错误处理方案,默认为“strict”,即严格的错误处理方案。
下面这个例子中使用函数各参数的默认值进行编码,并输出编码前后对象的类型。
str1 = "武林网VEVB"
str_re1 = str1.encode()
print('原字符串:', str1)
print('原字符串类型:', type(str1))
print('转换后的形式:', str_re1)
print('转换后的对象类型:', type(str_re1))
输出结果形式如下:
原字符串: 武林网VEVB
从上面的输出结果中可以看出,编码前str1的类型为<class 'str'>,即字符串类型,编码后的类型为:<class 'bytes'>,即字节类型,同时输出转换后的对象我们发现在前面有个字符'b',其表示后面的字符串以字节形式进行存储。在存储时,utf-8编码格式下,汉字占用三个字节,如上面前三个字节(以十六进制形式显示的):/xe7/xbf/x94,即是字符“翔”的编码。
原字符串类型: <class 'str'>
转换后的形式: b'/xe7/xbf/x94/xe5/xae/x87/xe4/xba/xadIT/xe4/xb9/x90/xe5/x9b/xad'
转换后的对象类型: <class 'bytes'>
encoding用于指定字符串的编码方式。
Python自带了很多编解码器,这些编解码器要么以C函数的方式实现,要么以映射表的方式存放到词典中。
这些内置的编解码器并非都能运用到每一种语言系统中,运用不正确在解码时可能会出现所谓的乱码问题。
str1 = "武林网VEVB"
re1 = str1.encode('utf-8')
re2 = str1.encode('gb2312')
re3 = str1.encode('gbk')
re4 = str1.encode('utf-16')
print('utf-8:', re1)
print('gb2312:', re2)
print('gbk:', re3)
print('utf-16:', re4)
运行结果如下所示:
utf-8: b'/xe7/xbf/x94/xe5/xae/x87/xe4/xba/xadIT/xe4/xb9/x90/xe5/x9b/xad'
对西文字符也可以使用ASCII编码方式,如果指定的编码方式不含相关字符的话,在没有指定errors参数时,默认会报错。
gb2312: b'/xcf/xe8/xd3/xee/xcd/xa4IT/xc0/xd6/xd4/xb0'
gbk: b'/xcf/xe8/xd3/xee/xcd/xa4IT/xc0/xd6/xd4/xb0'
utf-16: b'/xff/xfe/xd4/x7f/x87[/xadNI/x00T/x00PN/xedV'
re5 = "I Love China!".encode("ASCII")
print("西文ASCII:", re5)
re6 = "沉痛哀悼袁隆平和吴孟超两位院士。".encode("ASCII")
print("ASCII运用到中文会出错:", re6)
输出结果如下:
西文ASCII: b'I Love China!'
从上面的结果可以看出,汉字运用ASCII编码方式给出UnicodeEncodeError错误,意思是说:'ASCII'编解码器不能对字符串0~15位置的字符进行编码,序号超出范围(最大值128)。
Traceback (most recent call last):
File "D:/01Lesson/PY/encode_detail.py", line 21, in <module>
re6 = "沉痛哀悼袁隆平和吴孟超两位院士。".encode("ASCII")
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-15: ordinal not in range(128)
errors参数的作用是在编码出现错误时给出错误的处理方式,默认值为'strict',即出现错误时将抛出UnicodeError编码异常错误。UnicodeError包含编码错误的描述内容,其具体内容包括引发异常的编码方式名称、错误原因、编码对象出现错误的起止字符位置。
其它可以使用的值描述如下:
ignore:忽略不能进行编码的字符,编码结果中将不会包含不能进行编码的字符,且不会再给出任何提示信息。
replace:使用问号(?)替换不能进行编码的字符。
backslashreplace:使用反斜杠(/)开始的转义字符序列(/uNNNN)来替代不能实现编码的字符。
xmlcharrefreplace:使用适当的XML字符引用来替换不能实现编码的字符。其替换后的字符形如:&#NNNNN。
namereplace:使用反斜杠(/)开始的转义字符名称序列(/N{...})来替换未能转换的字符。此值是在Python3.5中新加入的。
下面给出一些例子来演示各种取值的输出情况:
str2 = "CRY:沉痛哀悼袁隆平院士和吴孟超院士CRY。"
re8 = str2.encode("ASCII",'ignore')
print("re8=", re8)
re9 = str2.encode("ASCII", 'replace')
print("re9=", re9)
re10 = str2.encode("ASCII", 'backslashreplace')
print("re10=", re10)
re11 = str2.encode("ASCII", 'xmlcharrefreplace')
print("re11=", re11)
re12 = str2.encode("ASCII", 'namereplace')
print('re12=', re12)
re7 = str2.encode("ASCII")
print("re7=", re7)
运行结果如下所示:
上面例子中最后一个是没有指定errors参数的情况。其它读者根据例子中的代码对照结果观察每个参数的输出情况。
以上详细介绍了Python中字符串处理函数encode()的使用方法,并对其两个参数encoding和errors进行了全面解释。
本文(完)
新闻热点
疑难解答