2009-11-09 14 views
5

ich in der Ansicht Aufruf der folgende Code haben ..UnicodeDecodeError mit Djangos request.FILES

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

In einigen Fällen bekomme ich

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

Was mache ich falsch? (Ich benutze Django 1.1.)

Vielen Dank.

Antwort

4

Django hat einige utilities, die damit umgehen (smart_unicode, force_unicode, smart_str). Im Allgemeinen benötigen Sie nur 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

Danke und ich werde alle von Ihnen upvote einmal registriert =) –

4

Sie Anfügen f.read() direkt an Unicode-String, ohne es zu Decodierung, wenn die Daten, die Sie aus der Datei lesen ist utf-8 codiert Verwendung utf-8, sonst verwenden, was codiert, ist es in.

zuerst dekodieren und dann an Körper z

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

Anurags Antwort ist korrekt. Ein weiteres Problem ist jedoch, dass Sie die Codierung der Dateien, die Benutzer hochladen, nicht sicher kennen. Es kann eine Schleife über ein Tupel der geläufigsten nützlich sein, bis Sie die richtige bekommen:

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

Wenn Sie nicht in der Kontrolle der Dateicodierung für Dateien, die hochgeladen werden können, kann man erraten, welche Codierung Eine Datei verwendet das Universal Encoding Detector Modul chardet.

+0

+1 Dies ist hilfreich. – shanyu