VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • Python3标准库:codecs字符串编码和解码(7)

(256))
  •  
  • # Make a list of pairs of ordinal values for the lower
  • # and uppercase letters
  • pairs = list(zip(
  • [ord(c) for c in string.ascii_lowercase],
  • [ord(c) for c in string.ascii_uppercase],
  • ))
  •  
  • # Modify the mapping to convert upper to lower and
  • # lower to upper.
  • decoding_map.update({
  • upper: lower
  • for (lower, upper)
  • in pairs
  • })
  • decoding_map.update({
  • lower: upper
  • for (lower, upper)
  • in pairs
  • })
  •  
  • # Create a separate encoding map.
  • encoding_map = codecs.make_encoding_map(decoding_map)
  •  
  • text = 'pi: \u03c0'
  •  
  • for error in ['ignore', 'replace', 'strict']:
  • try:
  • encoded = codecs.charmap_encode(
  • text, error, encoding_map)
  • except UnicodeEncodeError as err:
  • encoded = str(err)
  • print('{:7}: {}'.format(error, encoded))
  • 由于π的Unicode码点不再编码映射中,所以采用strict错误处理模式时会产生一个异常。

    定义了编码和解码映射之后,还需要建立一些额外的类,另外要注册编码。register()向注册表增加一个搜索函数,使得当用户希望使用这种编码时,codecs能够找到它。这个搜索函数必须有一个字符串参数,其中包含编码名,如果它知道这个编码则返回一个CodecInfo对象,否则返回None。

    
    	
    1. import codecs
    2.  
    3. def search1(encoding):
    4. print('search1: Searching for:', encoding)
    5. return None
    6.  
    7. def search2(encoding):
    8. print('search2: Searching for:', encoding)
    9. return None
    10.  
    11. codecs.register(search1)
    12. codecs.register(search2)
    13.  
    14. utf8 = codecs.lookup('utf-8')
    15. print('UTF-8:', utf8)
    16.  
    17. try:
    18. unknown = codecs.lookup('no-such-encoding')
    19. except LookupError as err:
    20. print('ERROR:', err)

    可以注册多个搜索函数,每个搜索函数将依次调用,直到一个搜索函数返回一个CodecInfo,或者所有搜索函数都已经调用。codecs注册的内部搜索函数知道如何加装标准codecs,如encodings的UTF-8,所以这些编码名不会传递到定制搜索函数。

    搜索函数返回的CodecInfo实例告诉codecs如何使用所支持的各种不同机制来完成编码和解码,包括:无状态编码、增量式编码和流编码。codecs包括一些基类来帮助建立字符映射编码。下面这个例子集成了所有内容,它会注册一个搜索函数,并返回为invertcaps codec配置的一个CodecInfo实例。 

    
    	
    1. import codecs
    2. import string
    3.  
    4. # Map every character to itself
    5. decoding_map = codecs.make_identity_dict(range(256))
    6.  
    7. # Make a list of pairs of ordinal values for the lower
    8. # and uppercase letters
    9. pairs = list(zip(
    10. [ord(c) for c in string.ascii_lowercase],
    11. [ord(c) for c in string.ascii_uppercase],
    12. ))
    13.  
    14. # Modify the mapping to convert upper to lower and
    15. # lower to upper.
    16. decoding_map.update({
    17. upper: lower
    18. for (lower, upper)
    19. in pairs
    20. })
    21. decoding_map.update({
    22. lower: upper
    23. for (lower, upper)
    24. in pairs
    25. })
    26.  
    27. # Create a separate encoding map.
    28. encoding_map = codecs.make_encoding_map(decoding_map)
    29.  
    30. class InvertCapsCodec(codecs.Codec):
    31. "Stateless encoder/decoder"
    32.  
    33. def encode(self, input, errors='strict'):
    34. return codecs.charmap_encode(input, errors, encoding_map)
    35.  
    36. def decode(self, input, errors='strict'):
    37. return codecs.charmap_decode(input, errors, decoding_map)
    38.  
    39. class InvertCapsIncrementalEncoder(codecs.IncrementalEncoder):
    
    相关教程