50 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import os
 | |
| import locale
 | |
| import sys
 | |
| 
 | |
| 
 | |
| # Sublime Text on OS X does not seem to report the correct encoding
 | |
| # so we hard-code that to UTF-8
 | |
| _encoding = 'utf-8' if sys.platform == 'darwin' else locale.getpreferredencoding()
 | |
| 
 | |
| _fallback_encodings = ['utf-8', 'cp1252']
 | |
| 
 | |
| 
 | |
| def unicode_from_os(e):
 | |
|     """
 | |
|     This is needed as some exceptions coming from the OS are
 | |
|     already encoded and so just calling unicode(e) will result
 | |
|     in an UnicodeDecodeError as the string isn't in ascii form.
 | |
| 
 | |
|     :param e:
 | |
|         The exception to get the value of
 | |
| 
 | |
|     :return:
 | |
|         The unicode version of the exception message
 | |
|     """
 | |
| 
 | |
|     if sys.version_info >= (3,):
 | |
|         return str(e)
 | |
| 
 | |
|     try:
 | |
|         if isinstance(e, Exception):
 | |
|             e = e.message
 | |
| 
 | |
|         if isinstance(e, unicode):
 | |
|             return e
 | |
| 
 | |
|         if isinstance(e, int):
 | |
|             e = str(e)
 | |
| 
 | |
|         return unicode(e, _encoding)
 | |
| 
 | |
|     # If the "correct" encoding did not work, try some defaults, and then just
 | |
|     # obliterate characters that we can't seen to decode properly
 | |
|     except UnicodeDecodeError:
 | |
|         for encoding in _fallback_encodings:
 | |
|             try:
 | |
|                 return unicode(e, encoding, errors='strict')
 | |
|             except:
 | |
|                 pass
 | |
|     return unicode(e, errors='replace')
 |