blob: 61bb0415788bc884c07bd4ade31263f4f55485d3 [file] [log] [blame]
Guido van Rossum0229bf62000-03-10 23:17:24 +00001""" 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"""
Marc-André Lemburg92b550c2001-06-19 20:07:51 +00009import codecs, sys
Guido van Rossum0229bf62000-03-10 23:17:24 +000010
11### Codec APIs
12
Walter Dörwald69652032004-09-07 20:24:22 +000013encode = codecs.utf_16_encode
Guido van Rossum0229bf62000-03-10 23:17:24 +000014
Walter Dörwald69652032004-09-07 20:24:22 +000015def decode(input, errors='strict'):
16 return codecs.utf_16_decode(input, errors, True)
Guido van Rossum0229bf62000-03-10 23:17:24 +000017
Walter Dörwaldabb02e52006-03-15 11:35:15 +000018class 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
37class IncrementalDecoder(codecs.BufferedIncrementalDecoder):
38 def __init__(self, errors='strict'):
39 codecs.BufferedIncrementalDecoder.__init__(self, errors)
40 self.decoder = None
41
42 def _buffer_decode(self, input, errors, final):
43 if self.decoder is None:
44 (output, consumed, byteorder) = \
45 codecs.utf_16_ex_decode(input, errors, 0, final)
46 if byteorder == -1:
47 self.decoder = codecs.utf_16_le_decode
48 elif byteorder == 1:
49 self.decoder = codecs.utf_16_be_decode
50 elif consumed >= 2:
51 raise UnicodeError("UTF-16 stream does not start with BOM")
52 return (output, consumed)
53 return self.decoder(input, self.errors, final)
54
55 def reset(self):
56 codecs.BufferedIncrementalDecoder.reset(self)
57 self.decoder = None
58
Walter Dörwald69652032004-09-07 20:24:22 +000059class StreamWriter(codecs.StreamWriter):
Marc-André Lemburg92b550c2001-06-19 20:07:51 +000060 def __init__(self, stream, errors='strict'):
Marc-André Lemburg92b550c2001-06-19 20:07:51 +000061 codecs.StreamWriter.__init__(self, stream, errors)
Victor Stinner7df55da2010-05-22 13:37:56 +000062 self.encoder = None
63
64 def reset(self):
65 codecs.StreamWriter.reset(self)
66 self.encoder = None
Marc-André Lemburg92b550c2001-06-19 20:07:51 +000067
Walter Dörwald69652032004-09-07 20:24:22 +000068 def encode(self, input, errors='strict'):
Victor Stinner7df55da2010-05-22 13:37:56 +000069 if self.encoder is None:
70 result = codecs.utf_16encoder(input, errors)
71 if sys.byteorder == 'little':
72 self.encoder = codecs.utf_16_leencoder
73 else:
74 self.encoder = codecs.utf_16_beencoder
75 return result
Walter Dörwald69652032004-09-07 20:24:22 +000076 else:
Victor Stinner7df55da2010-05-22 13:37:56 +000077 return self.encoder(input, errors)
Tim Peters469cdad2002-08-08 20:19:19 +000078
Walter Dörwald69652032004-09-07 20:24:22 +000079class StreamReader(codecs.StreamReader):
Marc-André Lemburg92b550c2001-06-19 20:07:51 +000080
Walter Dörwald729c31f2005-03-14 19:06:30 +000081 def reset(self):
82 codecs.StreamReader.reset(self)
83 try:
84 del self.decode
85 except AttributeError:
86 pass
87
Walter Dörwald69652032004-09-07 20:24:22 +000088 def decode(self, input, errors='strict'):
89 (object, consumed, byteorder) = \
90 codecs.utf_16_ex_decode(input, errors, 0, False)
91 if byteorder == -1:
92 self.decode = codecs.utf_16_le_decode
93 elif byteorder == 1:
94 self.decode = codecs.utf_16_be_decode
95 elif consumed>=2:
96 raise UnicodeError,"UTF-16 stream does not start with BOM"
97 return (object, consumed)
Marc-André Lemburg3ccb09c2002-04-05 12:12:00 +000098
Guido van Rossum0229bf62000-03-10 23:17:24 +000099### encodings module API
100
101def getregentry():
Walter Dörwaldabb02e52006-03-15 11:35:15 +0000102 return codecs.CodecInfo(
103 name='utf-16',
104 encode=encode,
105 decode=decode,
106 incrementalencoder=IncrementalEncoder,
107 incrementaldecoder=IncrementalDecoder,
108 streamreader=StreamReader,
109 streamwriter=StreamWriter,
110 )