使用Django的request.FILES的UnicodeDecodeError

时间:2009-11-09 04:41:13

标签: python django

我在视图调用中有以下代码..

def view(request):
    body = u""  
    for filename, f in request.FILES.items():
        body = body + 'Filename: ' + filename + '\n' + f.read() + '\n'

在某些情况下,我得到了

UnicodeDecodeError: 'ascii' codec can't decode byte 0xf0 in position 7470: ordinal not in range(128)

我做错了什么? (我正在使用Django 1.1。)

谢谢。

4 个答案:

答案 0 :(得分:5)

Django有一些utilities来处理这个问题(smart_unicode,force_unicode,smart_str)。通常你只需要smart_unicode。

from django.utils.encoding import smart_unicode
def view(request):
    body = u""  
    for filename, f in request.FILES.items():
        body = body + 'Filename: ' + filename + '\n' + smart_unicode(f.read()) + '\n'

答案 1 :(得分:4)

你将f.read()直接附加到unicode字符串,而不解码它,如果你从文件读取的数据是utf-8编码使用utf-8,否则使用它所在的任何编码。

先解码,然后附加到正文,例如

data = f.read().decode("utf-8")
body = body + 'Filename: ' + filename + '\n' + data + '\n'

答案 2 :(得分:4)

Anurag的回答是正确的。但是,此处的另一个问题是您无法确定用户上传的文件的编码。循环一个最常见的元组可能是有用的,直到你得到正确的元组:

encodings = ('windows-xxx', 'iso-yyy', 'utf-8',)
for e in encodings:
    try:
        data = f.read().decode(e)
        break
    except UnicodeDecodeError:
        pass

答案 3 :(得分:3)

如果您无法控制可以上传的文件的文件编码,您可以使用Universal Encoding Detector模块chardet猜测文件的编码。