我有一个带有unicode名称的文件(例如中文字符)。我得到一个UnicodeEncodeError。我正在使用带有utf8的postgres数据库和ubuntu lucid 64上的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)
来自shell的:
答案 0 :(得分:3)
我认为问题出在你的字符串格式上。在python2中,它自动在str
类型(一系列字节)和unicode
类型之间进行转换,类型代表unicode代码点的抽象系列。
我假设您的filename
类型为unicode
。
"tmp/%s/%s"
是一个字节字符串,因此python会尝试自动编码您的unicode
到str
以匹配。问题是它使用ascii
编码来执行此操作,但无法保存您的数据。
将return
语句更改为使用temp2
代替filename
应该有效,因为现在您正在使用正确的类型。
对于未来,我还建议观看我在评论中链接的演示文稿,因为它提供了几种避免此类问题的策略。主要的一点是,你应该在程序之外发送数据时只使用字节。一旦您从外部世界收到字节,decode
将其解码为unicode,并且当您从程序中发送数据时仅encode
。您还应该在内部使用unicode字符串文字(u""
而不是""
)。
我还建议使用比tempN
更有意义的变量名。
答案 1 :(得分:0)
Django附带了一些有用的功能,你可以在这里使用:https://docs.djangoproject.com/en/dev/ref/unicode/#conversion-functions
我认为smart_str
就是你所需要的。
另一种方法是重命名用户上传的文件。