django.utils.encoding.DjangoUnicodeDecodeError 错误

2 投票
1 回答
4084 浏览
提问于 2025-04-15 16:11

我在尝试通过通用关系向Django模型添加一个条目时遇到了以下错误。

django.utils.encoding.DjangoUnicodeDecodeError: 'utf8' codec can't decode byte 0xb8 in position 24: unexpected code byte. You passed in 'ASL/60Styles_Timeless-3_\xb8 CaLe.asl' (<type 'str'>)

这个模型是这样的:

class MD5(models.Model):
    value = models.CharField(max_length=32, db_index=True)
    filename = models.CharField(max_length=100)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()

表的字符集是utf8,排序规则是utf8_general_ci。

这是否意味着文件名不是一个有效的utf8字符串?我该如何修复这个错误,或者我们能否将无效的字符串转换为有效格式?

1 个回答

5

看起来你的文件系统并没有使用UTF-8编码:

>>> a = 'ASL/60Styles_Timeless-3_\xb8 CaLe.asl'
>>> print a.decode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.5/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xb8 in position 24: unexpected code byte
>>> a.decode('iso8859-2')
u'ASL/60Styles_Timeless-3_\xb8 CaLe.asl'
>>> print a.decode('iso8859-2')
ASL/60Styles_Timeless-3_¸ CaLe.asl

我现在才意识到你得到的字符串其实已经是unicode格式了。试试用这个方法来获取unicode:

>>> a.decode('raw_unicode_escape')
u'ASL/60Styles_Timeless-3_\xb8 CaLe.asl'

撰写回答