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:
Malcolm Tredinnick 2007-11-04 03:37:04 +00:00
parent 6f7fd897bc
commit 3f1ce2e602
1 changed files with 21 additions and 7 deletions

View File

@ -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'):