• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1import unicodedata
2import sys
3
4from setuptools.extern import six
5
6
7# HFS Plus uses decomposed UTF-8
8def decompose(path):
9    if isinstance(path, six.text_type):
10        return unicodedata.normalize('NFD', path)
11    try:
12        path = path.decode('utf-8')
13        path = unicodedata.normalize('NFD', path)
14        path = path.encode('utf-8')
15    except UnicodeError:
16        pass  # Not UTF-8
17    return path
18
19
20def filesys_decode(path):
21    """
22    Ensure that the given path is decoded,
23    NONE when no expected encoding works
24    """
25
26    if isinstance(path, six.text_type):
27        return path
28
29    fs_enc = sys.getfilesystemencoding() or 'utf-8'
30    candidates = fs_enc, 'utf-8'
31
32    for enc in candidates:
33        try:
34            return path.decode(enc)
35        except UnicodeDecodeError:
36            continue
37
38
39def try_encode(string, enc):
40    "turn unicode encoding into a functional routine"
41    try:
42        return string.encode(enc)
43    except UnicodeEncodeError:
44        return None
45