1""" Python 'utf-16' Codec 2 3 4Written by Marc-Andre Lemburg (mal@lemburg.com). 5 6(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. 7 8""" 9import codecs, sys 10 11### Codec APIs 12 13encode = codecs.utf_16_encode 14 15def decode(input, errors='strict'): 16 return codecs.utf_16_decode(input, errors, True) 17 18class IncrementalEncoder(codecs.IncrementalEncoder): 19 def __init__(self, errors='strict'): 20 codecs.IncrementalEncoder.__init__(self, errors) 21 self.encoder = None 22 23 def encode(self, input, final=False): 24 if self.encoder is None: 25 result = codecs.utf_16_encode(input, self.errors)[0] 26 if sys.byteorder == 'little': 27 self.encoder = codecs.utf_16_le_encode 28 else: 29 self.encoder = codecs.utf_16_be_encode 30 return result 31 return self.encoder(input, self.errors)[0] 32 33 def reset(self): 34 codecs.IncrementalEncoder.reset(self) 35 self.encoder = None 36 37 def getstate(self): 38 # state info we return to the caller: 39 # 0: stream is in natural order for this platform 40 # 2: endianness hasn't been determined yet 41 # (we're never writing in unnatural order) 42 return (2 if self.encoder is None else 0) 43 44 def setstate(self, state): 45 if state: 46 self.encoder = None 47 else: 48 if sys.byteorder == 'little': 49 self.encoder = codecs.utf_16_le_encode 50 else: 51 self.encoder = codecs.utf_16_be_encode 52 53class IncrementalDecoder(codecs.BufferedIncrementalDecoder): 54 def __init__(self, errors='strict'): 55 codecs.BufferedIncrementalDecoder.__init__(self, errors) 56 self.decoder = None 57 58 def _buffer_decode(self, input, errors, final): 59 if self.decoder is None: 60 (output, consumed, byteorder) = \ 61 codecs.utf_16_ex_decode(input, errors, 0, final) 62 if byteorder == -1: 63 self.decoder = codecs.utf_16_le_decode 64 elif byteorder == 1: 65 self.decoder = codecs.utf_16_be_decode 66 elif consumed >= 2: 67 raise UnicodeError("UTF-16 stream does not start with BOM") 68 return (output, consumed) 69 return self.decoder(input, self.errors, final) 70 71 def reset(self): 72 codecs.BufferedIncrementalDecoder.reset(self) 73 self.decoder = None 74 75class StreamWriter(codecs.StreamWriter): 76 def __init__(self, stream, errors='strict'): 77 codecs.StreamWriter.__init__(self, stream, errors) 78 self.encoder = None 79 80 def reset(self): 81 codecs.StreamWriter.reset(self) 82 self.encoder = None 83 84 def encode(self, input, errors='strict'): 85 if self.encoder is None: 86 result = codecs.utf_16_encode(input, errors) 87 if sys.byteorder == 'little': 88 self.encoder = codecs.utf_16_le_encode 89 else: 90 self.encoder = codecs.utf_16_be_encode 91 return result 92 else: 93 return self.encoder(input, errors) 94 95class StreamReader(codecs.StreamReader): 96 97 def reset(self): 98 codecs.StreamReader.reset(self) 99 try: 100 del self.decode 101 except AttributeError: 102 pass 103 104 def decode(self, input, errors='strict'): 105 (object, consumed, byteorder) = \ 106 codecs.utf_16_ex_decode(input, errors, 0, False) 107 if byteorder == -1: 108 self.decode = codecs.utf_16_le_decode 109 elif byteorder == 1: 110 self.decode = codecs.utf_16_be_decode 111 elif consumed>=2: 112 raise UnicodeError,"UTF-16 stream does not start with BOM" 113 return (object, consumed) 114 115### encodings module API 116 117def getregentry(): 118 return codecs.CodecInfo( 119 name='utf-16', 120 encode=encode, 121 decode=decode, 122 incrementalencoder=IncrementalEncoder, 123 incrementaldecoder=IncrementalDecoder, 124 streamreader=StreamReader, 125 streamwriter=StreamWriter, 126 ) 127