diff options
| author | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2007-11-18 05:48:24 +0000 |
|---|---|---|
| committer | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2007-11-18 05:48:24 +0000 |
| commit | 3d07f94d68ae7ef69c336c36ee119ef49c1e6028 (patch) | |
| tree | 5ddb605fbe53758ed57b876d73791691d8ebf7c6 /django/utils/encoding.py | |
| parent | 44df4e390fc9e037a3ab2775ffd695c80831f0ee (diff) | |
queryset-refactor: Merged from trunk up to [6689].
git-svn-id: http://code.djangoproject.com/svn/django/branches/queryset-refactor@6690 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/utils/encoding.py')
| -rw-r--r-- | django/utils/encoding.py | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/django/utils/encoding.py b/django/utils/encoding.py index 2bd1ef6563..2ab0db7432 100644 --- a/django/utils/encoding.py +++ b/django/utils/encoding.py @@ -1,7 +1,19 @@ import types import urllib import datetime + from django.utils.functional import Promise +from django.utils.safestring import SafeData, mark_safe + +class DjangoUnicodeDecodeError(UnicodeDecodeError): + def __init__(self, obj, *args): + self.obj = obj + UnicodeDecodeError.__init__(self, *args) + + def __str__(self): + original = UnicodeDecodeError.__str__(self) + return '%s. You passed in %r (%s)' % (original, self.obj, + type(self.obj)) class StrAndUnicode(object): """ @@ -33,13 +45,19 @@ def force_unicode(s, encoding='utf-8', strings_only=False, errors='strict'): """ if strings_only and isinstance(s, (types.NoneType, int, long, datetime.datetime, datetime.date, datetime.time, float)): return s - if not isinstance(s, basestring,): - if hasattr(s, '__unicode__'): - s = unicode(s) - else: - s = unicode(str(s), encoding, errors) - elif not isinstance(s, unicode): - s = unicode(s, encoding, errors) + try: + if not isinstance(s, basestring,): + if hasattr(s, '__unicode__'): + s = unicode(s) + else: + s = unicode(str(s), encoding, errors) + elif not isinstance(s, unicode): + # Note: We use .decode() here, instead of unicode(s, encoding, + # errors), so that if s is a SafeString, it ends up being a + # SafeUnicode at the end. + s = s.decode(encoding, errors) + except UnicodeDecodeError, e: + raise DjangoUnicodeDecodeError(s, *e.args) return s def smart_str(s, encoding='utf-8', strings_only=False, errors='strict'): |
