2013-02-26 30 views
8

Tôi biết có tiêu đề hiện tại về điều này, nhưng có câu hỏi khác với tôi. Đây là vấn đề của tôi. Tôi sử dụng bộ xử lý ngữ cảnh để hiển thị tên người dùng. Nó hoạt động nhưng sentry của tôi phát hiện một lỗi ngày hôm qua.UnicodeEncodeError: 'ascii' codec không thể mã hóa ký tự u ' xe9' ở vị trí 1: thứ tự không nằm trong phạm vi (128)

UnicodeEncodeError: 'ascii' codec không thể mã hóa kí tự u '\ xe9' ở vị trí 1: thứ tự không trong phạm vi (128)

Đây là mã của tôi:

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,} 

nguyên nhân là gì điều này? Hoặc ký tự nhập của người dùng cho tên của họ?

Trả lời

18

Về cơ bản, đó là vấn đề về đầu vào của người dùng.

Mã hóa văn bản là toàn bộ "điều" và khó vào, nhưng trong trình bao hạt, người dùng đã nhập ký tự Unicode không thể dễ dàng ánh xạ tới ký tự ASCII.

Bạn có thể khắc phục điều này bằng cách thay đổi này:

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

Để này:

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

này cho Python để xử lý chuỗi như là một chuỗi unicode (trong đó có tất cả các chức năng bình thường như một ascii chuỗi).

+0

trước khi tôi đánh dấu câu trả lời của bạn. Sử dụng {{user.get_full_name}} trong mẫu có ổn không và nó sẽ không phát hiện lỗi ascii? – catherine

+1

Vâng, được rồi. Công cụ tích hợp của Django luôn luôn (thường) trả về các chuỗi unicode. –

+0

Ok cảm ơn thông tin – catherine

Các vấn đề liên quan