NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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)