3

我有一个带有 unicode 名称的文件(例如中文字符)。我得到一个 UnicodeEncodeError。我在 ubuntu lucid 64 上使用带有 utf8 的 postgres 数据库和 django 开发服务器。我错过了什么?我执行以下操作,其中 filename 是 models.py 中文件的 unicode 名称:

def get_upload_path(instance,filename):
    return filename # Unicode error if filename has non latin 1 characters

class Kind (models.Model):
    style = models.ForeignKey(Style)
    kind_file = models.FileField(upload_to=get_upload_path)

从外壳:

在此处输入图像描述

4

2 回答 2

3

我相信问题出在您的字符串格式上。在 python2 中,它会自动在str类型(即一系列字节)和unicode类型之间进行转换,类型表示 unicode 代码点的抽象系列。

我假设你filename的类型是unicode.

"tmp/%s/%s"是一个字节字符串,所以 python 会尝试自动将你编码unicodestr匹配。问题是它使用ascii编码来做到这一点,它不能保存你的数据。

将您的语句更改return为使用temp2而不是filename应该可以工作,因为现在您正在一起使用正确的类型。


对于未来,我还建议观看我在评论中链接到的演示文稿,因为它提供了避免此类问题的几种策略。主要的一个是你应该只在程序外发送数据时使用字节。一旦你从外部世界接收到字节,decode它们就会变成 unicode,并且只有encode当你从程序中发送数据时。您还应该在内部使用 unicode 字符串文字(u""而不是"")。

我还推荐比tempN.

于 2012-05-22T00:49:50.880 回答
0

Django 附带一些有用的功能,您可以在此处使用:https ://docs.djangoproject.com/en/dev/ref/unicode/#conversion-functions

我认为smart_str是你需要的。

另一种方法是重命名用户上传的文件。

于 2012-05-22T01:19:29.737 回答