1import sys 2 3 4PY2 = sys.version_info < (3, 0) 5PY36 = sys.version_info >= (3, 6) 6PYPY = hasattr(sys, "pypy_version_info") 7 8_HAS_FOLD = PY36 9 10 11try: # Python 2 12 long = long 13 unicode = unicode 14 basestring = basestring 15except NameError: # Python 3 16 long = int 17 unicode = str 18 basestring = str 19 20 21def decode(string, encodings=None): 22 if not PY2 and not isinstance(string, bytes): 23 return string 24 25 if PY2 and isinstance(string, unicode): 26 return string 27 28 encodings = encodings or ["utf-8", "latin1", "ascii"] 29 30 for encoding in encodings: 31 try: 32 return string.decode(encoding) 33 except (UnicodeEncodeError, UnicodeDecodeError): 34 pass 35 36 return string.decode(encodings[0], errors="ignore") 37 38 39def encode(string, encodings=None): 40 if not PY2 and isinstance(string, bytes): 41 return string 42 43 if PY2 and isinstance(string, str): 44 return string 45 46 encodings = encodings or ["utf-8", "latin1", "ascii"] 47 48 for encoding in encodings: 49 try: 50 return string.encode(encoding) 51 except (UnicodeEncodeError, UnicodeDecodeError): 52 pass 53 54 return string.encode(encodings[0], errors="ignore") 55