Django 1.9添加含Unicode的模型时触发UnicodeDecodeError问题求助
解决Django 1.9中UnicodeDecodeError的问题
嘿,这个错误我之前帮朋友排查过!本质原因很明确:你在读取上传的cvfile内容时,用UTF-8编码去解码了一个非UTF-8格式的文件——那个0x96字节是Windows-1252编码里的长破折号,UTF-8完全不识别它,所以就抛出了解码错误。
结合你提到重写了save方法,我猜你应该是在把上传文件的内容读取出来存到cv这个TextField里对吧?给你几个实用的解决办法:
方法一:多编码兜底尝试
优先用UTF-8解码,失败了就用Windows-1252(Windows系统生成的文档常用这个编码)兜底,这样能兼容更多场景:
class Clean(models.Model): name = models.CharField(max_length=100) cv = models.TextField(max_length=10000, blank=True, null=True) cvfile = models.FileField(validators=[validate_file_extension]) def save(self, *args, **kwargs): if self.cvfile: file_content = self.cvfile.read() try: get_text = file_content.decode('utf-8') except UnicodeDecodeError: # 兜底处理Windows常用编码 get_text = file_content.decode('windows-1252') self.cv = get_text # 一定要调用父类的save方法 super(Clean, self).save(*args, **kwargs)
方法二:忽略或替换错误字符
如果那些特殊字符对你来说不重要,可以直接让解码时忽略错误,或者用占位符替换:
# 用?替换无法解码的字符 get_text = file_content.decode('utf-8', errors='replace') # 或者直接忽略错误字符 get_text = file_content.decode('utf-8', errors='ignore')
额外小建议
如果是面向普通用户的功能,最好在上传页面加个提示,告诉用户尽量上传UTF-8编码的文档(比如用记事本保存时选择UTF-8编码),这样能从源头减少这类问题~
内容的提问来源于stack exchange,提问作者Yunter
相关产品推荐
相关产品推荐

