我在视图调用中有以下代码..
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。)
谢谢。
答案 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
猜测文件的编码。