utils.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. import six
  4. def force_text(s, encoding='utf8', errors='strict'):
  5. if isinstance(s, six.text_type):
  6. return s
  7. if not issubclass(type(s), six.string_types):
  8. if six.PY3:
  9. if isinstance(s, bytes):
  10. s = six.text_type(s, encoding, errors)
  11. else:
  12. s = six.text_type(s)
  13. elif hasattr(s, '__unicode__'):
  14. s = six.text_type(s)
  15. else:
  16. s = six.text_type(bytes(s), encoding, errors)
  17. else:
  18. # Note: We use .decode() here, instead of six.text_type(s, encoding,
  19. # errors), so that if s is a SafeBytes, it ends up being a
  20. # SafeText at the end.
  21. s = s.decode(encoding, errors)
  22. return s
  23. def force_bytes(s, encoding='utf-8', errors='strict'):
  24. if isinstance(s, six.binary_type):
  25. if encoding == 'utf-8':
  26. return s
  27. else:
  28. return s.decode('utf-8', errors).encode(encoding, errors)
  29. if not isinstance(s, six.string_types):
  30. try:
  31. if six.PY3:
  32. return six.text_type(s).encode(encoding)
  33. else:
  34. return bytes(s)
  35. except UnicodeEncodeError:
  36. return six.text_type(s).encode(encoding, errors)
  37. else:
  38. return s.encode(encoding, errors)
  39. if six.PY3:
  40. force_str = force_text
  41. else:
  42. force_str = force_bytes
  43. force_unicode = force_text