2009-11-09 12 views
5

Mam następujący kod w widoku rozmowy ..UnicodeDecodeError z request.FILES Django

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

W niektórych przypadkach mogę

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

Co robię źle? (Używam Django 1.1.)

Dziękuję.

Odpowiedz

4

Django ma kilka utilities, które obsługują to (smart_unicode, force_unicode, smart_str). Generalnie potrzebujesz tylko 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

Dzięki i zamierzam upublicznić was wszystkich po zarejestrowaniu =) –

4

jesteś dołączanie f.read() bezpośrednio na Unicode ciągiem, bez ich dekodowania, jeśli dane czytasz z pliku jest kodowanie UTF-8 UTF-8, w przeciwnym wypadku zastosowanie kodowania cokolwiek to jest.

najpierw dekoduj, a następnie dołącz do ciała np.

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

Odpowiedź Anuraga jest prawidłowa. Jednak innym problemem jest to, że nie możesz znać kodowania plików przesyłanych przez użytkowników. Może to być przydatne do pętli na krotki z najczęstszych aż dojdziesz poprawny:

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

Jeśli nie jesteś w kontroli kodowania plików dla plików, które mogą być załadowane, można się domyślać, jakie kodowanie plik jest w użyciu z Universal Encoding Detector moduł .

+0

+1 To było pomocne. – shanyu

Powiązane problemy