IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]4.2 codecs--Codec注册管理和基类

    caimouse发表于 2015-10-31 09:26:38
    love 0

    本模块定义了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'

     

     




沪ICP备19023445号-2号
友情链接