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