mirror of
https://github.com/python/cpython.git
synced 2025-07-27 13:14:41 +00:00

of tuple) that provides incremental decoders and encoders (a way to use stateful codecs without the stream API). Functions codecs.getincrementaldecoder() and codecs.getincrementalencoder() have been added.
104 lines
3.2 KiB
Python
104 lines
3.2 KiB
Python
""" 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,
|
|
)
|