104 lines · 3.2 KB · Python
RawDownload
""" Python 'utf-16' Codec  Written by Marc-Andre Lemburg (mal@lemburg.com). (c) Copyright CNRI, All Rights Reserved. NO WARRANTY. """import codecs, sys ### Codec APIs encode = codecs.utf_16_encode def decode(input, errors='strict'):    return codecs.utf_16_decode(input, errors, True) class IncrementalEncoder(codecs.IncrementalEncoder):    def __init__(self, errors='strict'):        codecs.IncrementalEncoder.__init__(self, errors)        self.encoder = None     def encode(self, input, final=False):        if self.encoder is None:            result = codecs.utf_16_encode(input, self.errors)[0]            if sys.byteorder == 'little':                self.encoder = codecs.utf_16_le_encode            else:                self.encoder = codecs.utf_16_be_encode            return result        return self.encoder(input, self.errors)[0]     def reset(self):        codecs.IncrementalEncoder.reset(self)        self.encoder = None class IncrementalDecoder(codecs.BufferedIncrementalDecoder):    def __init__(self, errors='strict'):        codecs.BufferedIncrementalDecoder.__init__(self, errors)        self.decoder = None     def _buffer_decode(self, input, errors, final):        if self.decoder is None:            (output, consumed, byteorder) = \                codecs.utf_16_ex_decode(input, errors, 0, final)            if byteorder == -1:                self.decoder = codecs.utf_16_le_decode            elif byteorder == 1:                self.decoder = codecs.utf_16_be_decode            elif consumed >= 2:                raise UnicodeError("UTF-16 stream does not start with BOM")            return (output, consumed)        return self.decoder(input, self.errors, final)     def reset(self):        codecs.BufferedIncrementalDecoder.reset(self)        self.decoder = None class StreamWriter(codecs.StreamWriter):    def __init__(self, stream, errors='strict'):        self.bom_written = False        codecs.StreamWriter.__init__(self, stream, errors)     def encode(self, input, errors='strict'):        self.bom_written = True        result = codecs.utf_16_encode(input, errors)        if sys.byteorder == 'little':            self.encode = codecs.utf_16_le_encode        else:            self.encode = codecs.utf_16_be_encode        return result class StreamReader(codecs.StreamReader):     def reset(self):        codecs.StreamReader.reset(self)        try:            del self.decode        except AttributeError:            pass     def decode(self, input, errors='strict'):        (object, consumed, byteorder) = \            codecs.utf_16_ex_decode(input, errors, 0, False)        if byteorder == -1:            self.decode = codecs.utf_16_le_decode        elif byteorder == 1:            self.decode = codecs.utf_16_be_decode        elif consumed>=2:            raise UnicodeError,"UTF-16 stream does not start with BOM"        return (object, consumed) ### encodings module API def getregentry():    return codecs.CodecInfo(        name='utf-16',        encode=encode,        decode=decode,        incrementalencoder=IncrementalEncoder,        incrementaldecoder=IncrementalDecoder,        streamreader=StreamReader,        streamwriter=StreamWriter,    )