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