2009-11-09 22 views
5

tengo el siguiente código en la llamada vista ..UnicodeDecodeError con request.FILES de Django

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

En algunos casos Puedo obtener

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

¿Qué estoy haciendo mal? (Estoy usando Django 1.1.)

Gracias.

Respuesta

4

Django tiene algunos utilities que manejan esto (smart_unicode, force_unicode, smart_str). En general, solo necesitas 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

Gracias y voy a votarte a todos una vez registrado =) –

4

está anexando f.read() directamente a cadena Unicode, sin decodificar, si los datos que está leyendo del archivo es UTF-8 uso codificado UTF-8, el uso de otra cosa cualquiera que sea la codificación que se encuentra.

decodifícalo primero y luego añádelo al cuerpo por ej.

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

La respuesta de Anurag es correcta. Sin embargo, otro problema aquí es que no puede conocer con certeza la codificación de los archivos que cargan los usuarios. Puede ser útil para recorrer una tupla de los más comunes hasta que usted consigue la correcta:

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

Si no está en control de la codificación de archivos para los archivos que se pueden cargar, se puede adivinar qué codificación un archivo está usando el módulo Universal Encoding Detectorchardet.

+0

+1 Esto ha sido útil. – shanyu

Cuestiones relacionadas