utf_8_sig.py (3145B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\stdlib\encodings\utf_8_sig.py 2 import codecs 3 4 def encode(input, errors = 'strict'): 5 return (codecs.BOM_UTF8 + codecs.utf_8_encode(input, errors)[0], len(input)) 6 7 8 def decode(input, errors = 'strict'): 9 prefix = 0 10 if input[:3] == codecs.BOM_UTF8: 11 input = input[3:] 12 prefix = 3 13 output, consumed = codecs.utf_8_decode(input, errors, True) 14 return (output, consumed + prefix) 15 16 17 class IncrementalEncoder(codecs.IncrementalEncoder): 18 19 def __init__(self, errors = 'strict'): 20 codecs.IncrementalEncoder.__init__(self, errors) 21 self.first = 1 22 23 def encode(self, input, final = False): 24 if self.first: 25 self.first = 0 26 return codecs.BOM_UTF8 + codecs.utf_8_encode(input, self.errors)[0] 27 else: 28 return codecs.utf_8_encode(input, self.errors)[0] 29 30 def reset(self): 31 codecs.IncrementalEncoder.reset(self) 32 self.first = 1 33 34 def getstate(self): 35 return self.first 36 37 def setstate(self, state): 38 self.first = state 39 40 41 class IncrementalDecoder(codecs.BufferedIncrementalDecoder): 42 43 def __init__(self, errors = 'strict'): 44 codecs.BufferedIncrementalDecoder.__init__(self, errors) 45 self.first = True 46 47 def _buffer_decode(self, input, errors, final): 48 if self.first: 49 if len(input) < 3: 50 if codecs.BOM_UTF8.startswith(input): 51 return (u'', 0) 52 self.first = None 53 else: 54 self.first = None 55 if input[:3] == codecs.BOM_UTF8: 56 output, consumed = codecs.utf_8_decode(input[3:], errors, final) 57 return (output, consumed + 3) 58 return codecs.utf_8_decode(input, errors, final) 59 60 def reset(self): 61 codecs.BufferedIncrementalDecoder.reset(self) 62 self.first = True 63 64 65 class StreamWriter(codecs.StreamWriter): 66 67 def reset(self): 68 codecs.StreamWriter.reset(self) 69 try: 70 del self.encode 71 except AttributeError: 72 pass 73 74 def encode(self, input, errors = 'strict'): 75 self.encode = codecs.utf_8_encode 76 return encode(input, errors) 77 78 79 class StreamReader(codecs.StreamReader): 80 81 def reset(self): 82 codecs.StreamReader.reset(self) 83 try: 84 del self.decode 85 except AttributeError: 86 pass 87 88 def decode(self, input, errors = 'strict'): 89 if len(input) < 3: 90 if codecs.BOM_UTF8.startswith(input): 91 return (u'', 0) 92 elif input[:3] == codecs.BOM_UTF8: 93 self.decode = codecs.utf_8_decode 94 output, consumed = codecs.utf_8_decode(input[3:], errors) 95 return (output, consumed + 3) 96 self.decode = codecs.utf_8_decode 97 return codecs.utf_8_decode(input, errors) 98 99 100 def getregentry(): 101 return codecs.CodecInfo(name='utf-8-sig', encode=encode, decode=decode, incrementalencoder=IncrementalEncoder, incrementaldecoder=IncrementalDecoder, streamreader=StreamReader, streamwriter=StreamWriter)