Fixed #5640 -- Added some extra error reporting when smart_unicode() or
force_unicode() raise a UnicodeDecodeError. This should at least help people identify which is the bad piece of data they passed in. About the best we can do here. git-svn-id: http://code.djangoproject.com/svn/django/trunk@6649 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
6f7fd897bc
commit
3f1ce2e602
|
@ -1,8 +1,19 @@
|
||||||
import types
|
import types
|
||||||
import urllib
|
import urllib
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
from django.utils.functional import Promise
|
from django.utils.functional import Promise
|
||||||
|
|
||||||
|
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):
|
class StrAndUnicode(object):
|
||||||
"""
|
"""
|
||||||
A class whose __str__ returns its __unicode__ as a UTF-8 bytestring.
|
A class whose __str__ returns its __unicode__ as a UTF-8 bytestring.
|
||||||
|
@ -33,6 +44,7 @@ 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)):
|
if strings_only and isinstance(s, (types.NoneType, int, long, datetime.datetime, datetime.date, datetime.time, float)):
|
||||||
return s
|
return s
|
||||||
|
try:
|
||||||
if not isinstance(s, basestring,):
|
if not isinstance(s, basestring,):
|
||||||
if hasattr(s, '__unicode__'):
|
if hasattr(s, '__unicode__'):
|
||||||
s = unicode(s)
|
s = unicode(s)
|
||||||
|
@ -40,6 +52,8 @@ def force_unicode(s, encoding='utf-8', strings_only=False, errors='strict'):
|
||||||
s = unicode(str(s), encoding, errors)
|
s = unicode(str(s), encoding, errors)
|
||||||
elif not isinstance(s, unicode):
|
elif not isinstance(s, unicode):
|
||||||
s = unicode(s, encoding, errors)
|
s = unicode(s, encoding, errors)
|
||||||
|
except UnicodeDecodeError, e:
|
||||||
|
raise DjangoUnicodeDecodeError(s, *e.args)
|
||||||
return s
|
return s
|
||||||
|
|
||||||
def smart_str(s, encoding='utf-8', strings_only=False, errors='strict'):
|
def smart_str(s, encoding='utf-8', strings_only=False, errors='strict'):
|
||||||
|
|
Loading…
Reference in New Issue