encoding.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. # -*- coding: utf-8 -*-
  2. """
  3. celery.utils.encoding
  4. ~~~~~~~~~~~~~~~~~~~~~
  5. Utilities to encode text, and to safely emit text from running
  6. applications without crashing with the infamous :exc:`UnicodeDecodeError`
  7. exception.
  8. :copyright: (c) 2009 - 2011 by Ask Solem.
  9. :license: BSD, see LICENSE for more details.
  10. """
  11. from __future__ import absolute_import
  12. import sys
  13. import traceback
  14. is_py3k = sys.version_info >= (3, 0)
  15. if is_py3k:
  16. def str_to_bytes(s):
  17. if isinstance(s, str):
  18. return s.encode()
  19. return s
  20. def bytes_to_str(s):
  21. if isinstance(s, bytes):
  22. return s.decode()
  23. return s
  24. def from_utf8(s, *args, **kwargs):
  25. return s
  26. def ensure_bytes(s):
  27. if not isinstance(s, bytes):
  28. return str_to_bytes(s)
  29. return s
  30. def default_encode(obj):
  31. return obj
  32. str_t = str
  33. bytes_t = bytes
  34. else:
  35. def str_to_bytes(s): # noqa
  36. if isinstance(s, unicode):
  37. return s.encode()
  38. return s
  39. def bytes_to_str(s): # noqa
  40. return s
  41. def from_utf8(s, *args, **kwargs): # noqa
  42. return s.encode("utf-8", *args, **kwargs)
  43. str_t = unicode
  44. bytes_t = str
  45. ensure_bytes = str_to_bytes
  46. if sys.platform.startswith("java"):
  47. def default_encoding():
  48. return "utf-8"
  49. else:
  50. def default_encoding(): # noqa
  51. return sys.getfilesystemencoding()
  52. def safe_str(s, errors="replace"):
  53. s = bytes_to_str(s)
  54. if not isinstance(s, basestring):
  55. return safe_repr(s, errors)
  56. return _safe_str(s, errors)
  57. def _safe_str(s, errors="replace"):
  58. if is_py3k:
  59. return s
  60. encoding = default_encoding()
  61. try:
  62. if isinstance(s, unicode):
  63. return s.encode(encoding, errors)
  64. return unicode(s, encoding, errors)
  65. except Exception, exc:
  66. return "<Unrepresentable %r: %r %r>" % (
  67. type(s), exc, "\n".join(traceback.format_stack()))
  68. def safe_repr(o, errors="replace"):
  69. try:
  70. return repr(o)
  71. except Exception:
  72. return _safe_str(o, errors)