17db96d56Sopenharmony_ci""" Python 'utf-16' Codec 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_ciWritten by Marc-Andre Lemburg (mal@lemburg.com). 57db96d56Sopenharmony_ci 67db96d56Sopenharmony_ci(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. 77db96d56Sopenharmony_ci 87db96d56Sopenharmony_ci""" 97db96d56Sopenharmony_ciimport codecs, sys 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ci### Codec APIs 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_ciencode = codecs.utf_16_encode 147db96d56Sopenharmony_ci 157db96d56Sopenharmony_cidef decode(input, errors='strict'): 167db96d56Sopenharmony_ci return codecs.utf_16_decode(input, errors, True) 177db96d56Sopenharmony_ci 187db96d56Sopenharmony_ciclass IncrementalEncoder(codecs.IncrementalEncoder): 197db96d56Sopenharmony_ci def __init__(self, errors='strict'): 207db96d56Sopenharmony_ci codecs.IncrementalEncoder.__init__(self, errors) 217db96d56Sopenharmony_ci self.encoder = None 227db96d56Sopenharmony_ci 237db96d56Sopenharmony_ci def encode(self, input, final=False): 247db96d56Sopenharmony_ci if self.encoder is None: 257db96d56Sopenharmony_ci result = codecs.utf_16_encode(input, self.errors)[0] 267db96d56Sopenharmony_ci if sys.byteorder == 'little': 277db96d56Sopenharmony_ci self.encoder = codecs.utf_16_le_encode 287db96d56Sopenharmony_ci else: 297db96d56Sopenharmony_ci self.encoder = codecs.utf_16_be_encode 307db96d56Sopenharmony_ci return result 317db96d56Sopenharmony_ci return self.encoder(input, self.errors)[0] 327db96d56Sopenharmony_ci 337db96d56Sopenharmony_ci def reset(self): 347db96d56Sopenharmony_ci codecs.IncrementalEncoder.reset(self) 357db96d56Sopenharmony_ci self.encoder = None 367db96d56Sopenharmony_ci 377db96d56Sopenharmony_ci def getstate(self): 387db96d56Sopenharmony_ci # state info we return to the caller: 397db96d56Sopenharmony_ci # 0: stream is in natural order for this platform 407db96d56Sopenharmony_ci # 2: endianness hasn't been determined yet 417db96d56Sopenharmony_ci # (we're never writing in unnatural order) 427db96d56Sopenharmony_ci return (2 if self.encoder is None else 0) 437db96d56Sopenharmony_ci 447db96d56Sopenharmony_ci def setstate(self, state): 457db96d56Sopenharmony_ci if state: 467db96d56Sopenharmony_ci self.encoder = None 477db96d56Sopenharmony_ci else: 487db96d56Sopenharmony_ci if sys.byteorder == 'little': 497db96d56Sopenharmony_ci self.encoder = codecs.utf_16_le_encode 507db96d56Sopenharmony_ci else: 517db96d56Sopenharmony_ci self.encoder = codecs.utf_16_be_encode 527db96d56Sopenharmony_ci 537db96d56Sopenharmony_ciclass IncrementalDecoder(codecs.BufferedIncrementalDecoder): 547db96d56Sopenharmony_ci def __init__(self, errors='strict'): 557db96d56Sopenharmony_ci codecs.BufferedIncrementalDecoder.__init__(self, errors) 567db96d56Sopenharmony_ci self.decoder = None 577db96d56Sopenharmony_ci 587db96d56Sopenharmony_ci def _buffer_decode(self, input, errors, final): 597db96d56Sopenharmony_ci if self.decoder is None: 607db96d56Sopenharmony_ci (output, consumed, byteorder) = \ 617db96d56Sopenharmony_ci codecs.utf_16_ex_decode(input, errors, 0, final) 627db96d56Sopenharmony_ci if byteorder == -1: 637db96d56Sopenharmony_ci self.decoder = codecs.utf_16_le_decode 647db96d56Sopenharmony_ci elif byteorder == 1: 657db96d56Sopenharmony_ci self.decoder = codecs.utf_16_be_decode 667db96d56Sopenharmony_ci elif consumed >= 2: 677db96d56Sopenharmony_ci raise UnicodeError("UTF-16 stream does not start with BOM") 687db96d56Sopenharmony_ci return (output, consumed) 697db96d56Sopenharmony_ci return self.decoder(input, self.errors, final) 707db96d56Sopenharmony_ci 717db96d56Sopenharmony_ci def reset(self): 727db96d56Sopenharmony_ci codecs.BufferedIncrementalDecoder.reset(self) 737db96d56Sopenharmony_ci self.decoder = None 747db96d56Sopenharmony_ci 757db96d56Sopenharmony_ci def getstate(self): 767db96d56Sopenharmony_ci # additional state info from the base class must be None here, 777db96d56Sopenharmony_ci # as it isn't passed along to the caller 787db96d56Sopenharmony_ci state = codecs.BufferedIncrementalDecoder.getstate(self)[0] 797db96d56Sopenharmony_ci # additional state info we pass to the caller: 807db96d56Sopenharmony_ci # 0: stream is in natural order for this platform 817db96d56Sopenharmony_ci # 1: stream is in unnatural order 827db96d56Sopenharmony_ci # 2: endianness hasn't been determined yet 837db96d56Sopenharmony_ci if self.decoder is None: 847db96d56Sopenharmony_ci return (state, 2) 857db96d56Sopenharmony_ci addstate = int((sys.byteorder == "big") != 867db96d56Sopenharmony_ci (self.decoder is codecs.utf_16_be_decode)) 877db96d56Sopenharmony_ci return (state, addstate) 887db96d56Sopenharmony_ci 897db96d56Sopenharmony_ci def setstate(self, state): 907db96d56Sopenharmony_ci # state[1] will be ignored by BufferedIncrementalDecoder.setstate() 917db96d56Sopenharmony_ci codecs.BufferedIncrementalDecoder.setstate(self, state) 927db96d56Sopenharmony_ci state = state[1] 937db96d56Sopenharmony_ci if state == 0: 947db96d56Sopenharmony_ci self.decoder = (codecs.utf_16_be_decode 957db96d56Sopenharmony_ci if sys.byteorder == "big" 967db96d56Sopenharmony_ci else codecs.utf_16_le_decode) 977db96d56Sopenharmony_ci elif state == 1: 987db96d56Sopenharmony_ci self.decoder = (codecs.utf_16_le_decode 997db96d56Sopenharmony_ci if sys.byteorder == "big" 1007db96d56Sopenharmony_ci else codecs.utf_16_be_decode) 1017db96d56Sopenharmony_ci else: 1027db96d56Sopenharmony_ci self.decoder = None 1037db96d56Sopenharmony_ci 1047db96d56Sopenharmony_ciclass StreamWriter(codecs.StreamWriter): 1057db96d56Sopenharmony_ci def __init__(self, stream, errors='strict'): 1067db96d56Sopenharmony_ci codecs.StreamWriter.__init__(self, stream, errors) 1077db96d56Sopenharmony_ci self.encoder = None 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci def reset(self): 1107db96d56Sopenharmony_ci codecs.StreamWriter.reset(self) 1117db96d56Sopenharmony_ci self.encoder = None 1127db96d56Sopenharmony_ci 1137db96d56Sopenharmony_ci def encode(self, input, errors='strict'): 1147db96d56Sopenharmony_ci if self.encoder is None: 1157db96d56Sopenharmony_ci result = codecs.utf_16_encode(input, errors) 1167db96d56Sopenharmony_ci if sys.byteorder == 'little': 1177db96d56Sopenharmony_ci self.encoder = codecs.utf_16_le_encode 1187db96d56Sopenharmony_ci else: 1197db96d56Sopenharmony_ci self.encoder = codecs.utf_16_be_encode 1207db96d56Sopenharmony_ci return result 1217db96d56Sopenharmony_ci else: 1227db96d56Sopenharmony_ci return self.encoder(input, errors) 1237db96d56Sopenharmony_ci 1247db96d56Sopenharmony_ciclass StreamReader(codecs.StreamReader): 1257db96d56Sopenharmony_ci 1267db96d56Sopenharmony_ci def reset(self): 1277db96d56Sopenharmony_ci codecs.StreamReader.reset(self) 1287db96d56Sopenharmony_ci try: 1297db96d56Sopenharmony_ci del self.decode 1307db96d56Sopenharmony_ci except AttributeError: 1317db96d56Sopenharmony_ci pass 1327db96d56Sopenharmony_ci 1337db96d56Sopenharmony_ci def decode(self, input, errors='strict'): 1347db96d56Sopenharmony_ci (object, consumed, byteorder) = \ 1357db96d56Sopenharmony_ci codecs.utf_16_ex_decode(input, errors, 0, False) 1367db96d56Sopenharmony_ci if byteorder == -1: 1377db96d56Sopenharmony_ci self.decode = codecs.utf_16_le_decode 1387db96d56Sopenharmony_ci elif byteorder == 1: 1397db96d56Sopenharmony_ci self.decode = codecs.utf_16_be_decode 1407db96d56Sopenharmony_ci elif consumed>=2: 1417db96d56Sopenharmony_ci raise UnicodeError("UTF-16 stream does not start with BOM") 1427db96d56Sopenharmony_ci return (object, consumed) 1437db96d56Sopenharmony_ci 1447db96d56Sopenharmony_ci### encodings module API 1457db96d56Sopenharmony_ci 1467db96d56Sopenharmony_cidef getregentry(): 1477db96d56Sopenharmony_ci return codecs.CodecInfo( 1487db96d56Sopenharmony_ci name='utf-16', 1497db96d56Sopenharmony_ci encode=encode, 1507db96d56Sopenharmony_ci decode=decode, 1517db96d56Sopenharmony_ci incrementalencoder=IncrementalEncoder, 1527db96d56Sopenharmony_ci incrementaldecoder=IncrementalDecoder, 1537db96d56Sopenharmony_ci streamreader=StreamReader, 1547db96d56Sopenharmony_ci streamwriter=StreamWriter, 1557db96d56Sopenharmony_ci ) 156