2013-02-26 12 views
8

Wiem, że istnieje w tej sprawie tytuł, ale pytanie różni się od mojego. Oto mój problem. Używam procesora kontekstowego do wyświetlania nazwy użytkownika. Działa, ale mój wartownik wczoraj wykrył błąd.UnicodeEncodeError: Kodek 'ascii' nie może kodować znaków u ' xe9' w pozycji 1: porządek nie jest w zakresie (128)

UnicodeEncodeError: 'ascii' codec nie może kodować charakter u '\ xe9' w pozycji 1: nie porządkowej w zakresie (128)

Oto mój kod:

def display_name(request): 
    try: 
     name = "{0} {1}".format(request.user.first_name, request.user.last_name) 
     name = name.strip() 
     if not name: 
      name = request.user.username 
    except AttributeError: 
     name = None 

    return {'display_name': name,} 

Jaka jest przyczyna tego? Lub wprowadzony przez użytkownika znak dla ich nazwy?

Odpowiedz

18

Jest to w zasadzie problem z wprowadzaniem danych przez użytkownika.

Kodowanie tekstu to cała "rzecz", do której trudno się dostać, ale w powłoce orzechowej użytkownik wprowadził znak Unicode, którego nie można łatwo zmapować na znak ASCII.

Można rozwiązać ten problem poprzez zmianę to:

name = "{0} {1}".format(request.user.first_name, request.user.last_name) 

do tego:

name = u"{0} {1}".format(request.user.first_name, request.user.last_name) 

Mówi Python traktować ciąg jako ciąg znaków Unicode (który ma wszystkie normalne funkcje jako ASCII strunowy).

+0

zanim zaznaczę twoją odpowiedź. Czy można użyć {{user.get_full_name}} w szablonie i nie wykryje on błędu ASCII? – catherine

+1

Tak, w porządku. Wbudowane pliki Django zawsze (zwykle) zwracają ciągi znaków Unicode. –

+0

Ok dzięki za informacje – catherine

Powiązane problemy