source: python/trunk/Lib/encodings/utf_16.py

Last change on this file was 391, checked in by dmik, 11 years ago

python: Merge vendor 2.7.6 to trunk.

  • Property svn:eol-style set to native
File size: 3.9 KB
Line 
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 )
Note: See TracBrowser for help on using the repository browser.