2009-11-09 89 views
5

我已經在視圖中調用下面的代碼..的UnicodeDecodeError Django的request.FILES

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

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' 
+0

謝謝,我會註冊所有人,註冊一次=) – 2009-11-09 06:30:39

4

要附加f.read()直接將Unicode字符串,而不解碼,如果從文件中讀取的數據是UTF-8編碼使用UTF-8,否則使用任何編碼它是英寸

首先解碼,然後附加到主體例如

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

Anurag的回答是正確的。然而,這裏的另一個問題是你不能確定用戶上傳的文件的編碼。

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

如果你不是在文件的文件編碼,可以上傳的控制,你能猜出編碼:直到你得到正確的一個可能是循環很有用在最常見的一個元組一個文件正在使用Universal Encoding Detector模塊chardet

+0

+1此內容有幫助。 – shanyu 2009-11-09 09:22:43