本模块定义了Python标准codecs(编码和解码)的基类,也提供了对Python内部codec的注册,管理和数据处理过程。大部分标准的codecs都是文本编解码器,主要是用来把文本怎么样编码成字节方式。不过也有一些codecs是用来从文本到文本的编码方式,或者从字节到字节的编码方式。当然也可以根据基类来定制codecs,可以任意间的数据类型进行转换,只要注意在某些codecs是限制在文本编解码,某些是限制在字节之间编解码的。
对于任何的编解码器codec都有下面的函数:
codecs.encode(obj[, encoding[, errors]])
使用已经注册的编码器encoding来对对象obj进行编码,如果有出错按errors方式处理。默认编码器是utf-8。错误处理参数errors可以使用预定的,也可以按后面方法进行自定义。默认是strict方式处理,当出现错误时抛出异常ValueError。
例子:
#python 3.4.3 import codecs en = codecs.encode('把深圳建设成世界软件中心', 'utf_8', 'strict') print(en)
结果输出如下:
b'\xe6\x8a\x8a\xe6\xb7\xb1\xe5\x9c\xb3\xe5\xbb\xba\xe8\xae\xbe\xe6\x88\x90\xe4\xb8\x96\xe7\x95\x8c\xe8\xbd\xaf\xe4\xbb\xb6\xe4\xb8\xad\xe5\xbf\x83'
codecs.decode(obj[, encoding[, errors]])
使用已经注册的编码器encoding把对象obj进行解码,如果有出错按出错机制errors处理。默认编码器是utf-8。错误处理参数errors可以使用预定的,也可以按后面方法进行自定义。默认是strict方式处理,当出现错误时抛出异常ValueError。
例子:
#python 3.4.3 import codecs en = codecs.encode('把深圳建设成世界软件中心', 'utf_8', 'strict') print(en) de = codecs.decode(en, 'utf_8', 'strict') print(de)
结果输出如下: b'\xe6\x8a\x8a\xe6\xb7\xb1\xe5\x9c\xb3\xe5\xbb\xba\xe8\xae\xbe\xe6\x88\x90\xe4\xb8\x96\xe7\x95\x8c\xe8\xbd\xaf\xe4\xbb\xb6\xe4\xb8\xad\xe5\xbf\x83' 把深圳建设成世界软件中心 codecs.lookup(encoding) 通过编解码器的名称encoding来查找编解码器,如果成功找到返回CodecInfo对象,否则抛出异常LookupError。 例子:
#python 3.4.3 import codecs cinfo = codecs.lookup('utf_8') print(cinfo) cinfo = codecs.lookup('gb2312') print(cinfo) cinfo = codecs.lookup('test') print(cinfo)
结果输出如下:
<codecs.CodecInfo object for encoding utf-8 at 0x29a6500>
<codecs.CodecInfo object for encoding gb2312 at 0x29bf420>
Traceback (most recent call last):
File "E:/pywin/codecs1.py", line 10, in <module>
cinfo = codecs.lookup('test')
LookupError: unknown encoding: test
codecs.getencoder(encoding)
通过encoding获取编码器的编码函数,简化对编码的重复调用。如果找不到抛出异常LookupError。
例子:
#python 3.4.3 import codecs cinfo = codecs.getencoder('utf_8') print(cinfo) en = cinfo('深圳软件') print(en) cinfo = codecs.getencoder('gb2312') print(cinfo)
结果输出如下:
<built-in function utf_8_encode>
(b'\xe6\xb7\xb1\xe5\x9c\xb3\xe8\xbd\xaf\xe4\xbb\xb6', 4)
<built-in method encode of MultibyteCodec object at 0x029FB150>
codecs.getdecoder(encoding)
通过encoding获取解码器的函数。简化对解码的重复调用。如果找不到抛出异常LookupError。
例子:
#python 3.4.3
import codecs
cinfo = codecs.getdecoder('utf_8')
print(cinfo)
de = cinfo(b'\xe6\xb7\xb1\xe5\x9c\xb3\xe8\xbd\xaf\xe4\xbb\xb6')
print(de)
结果输出如下:
<function decode at 0x00261E88>
('深圳软件', 12)
codecs.getincrementalencoder(encoding)
返回一个encoding编码的增量编码器。如果没有找到抛出异常LookupError。
例子:
#python 3.4.3
import codecs
encoder = codecs.getincrementalencoder('idna')()
print(encoder)
encoder.reset()
en = encoder.encode(u"\xe4x")
en = encoder.encode(u"ample.org")
en = encoder.encode(u"", True)
print(en)
结果输出如下:
<encodings.idna.IncrementalEncoder object at 0x029BB4B0>
b'org'
codecs.getincrementaldecoder(encoding)
返回一个encoding编码的增量解码器。如果没有找到抛出异常LookupError。
例子:
#python 3.4.3
import codecs
d = codecs.getincrementaldecoder("utf-8-sig")()
s = u"spam"
print(d.decode(s.encode("utf-8-sig")))
结果输出如下:
spam
codecs.getreader(encoding)
返回一个encoding编码的流读取对象StreamReader,如果查找不到抛出异常 LookupError。
例子:
#python 3.4.3
import codecs
import urllib.request, json
f = urllib.request.urlopen("https://pypi.python.org/pypi/{}/{}/json".
format('jsonpatch', '1.11' or ''))
reader = codecs.getreader("utf-8")
pkg_data = json.load(reader(f))
f.close()
d = {}
d['name'] = pkg_data['info']['name']
d['homepage'] = pkg_data['info'].get('home_page', '')
print(d)
结果输出如下:
{'homepage': 'https://github.com/stefankoegl/python-json-patch', 'name': 'jsonpatch'}
codecs.getwriter(encoding)
返回一个encoding解码的流写入对象StreamWriter,如果查找不到抛出异常 LookupError。
例子:
#python 3.4.3
import io, codecs
s = io.BytesIO()
c = codecs.getwriter('gb18030')(s)
c.write('test')
print(s.getvalue())
结果输出如下:
b'test'