2011-12-22 7 views
7

Giả sử rằngCó sự khác nhau nào giữa toán tử `%` -format và `str.format()` trong python về mã hóa unicode và utf-8 không?

n = u"Tübingen" 
repr(n) # `T\xfcbingen` # Unicode 
i = 1 # integer 

Việc đầu tiên của các tập tin sau đây ném

UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 82: ordinal not in range(128) 

Khi tôi làm n.encode('utf8') nó hoạt động.

Tác phẩm thứ hai hoàn hảo trong cả hai trường hợp.

# Python File 1 
# 
#!/usr/bin/env python -B 
# encoding: utf-8 

print '{id}, {name}'.format(id=i, name=n) 

# Python File 2 
# 
#!/usr/bin/env python -B 
# encoding: utf-8 

print '%i, %s'% (i, n) 

Từ trong tài liệu nó được khuyến khích sử dụng format() thay vì các nhà điều hành định dạng %, tôi không hiểu tại sao format() có vẻ "handicaped". format() chỉ hoạt động với utf8 -strings?

+0

Khi bạn đã thực hiện định dạng 'u '{id}, {name}' (id = i, name = n)' bạn đã quan sát điều gì? Lưu ý rằng chuỗi định dạng là một chuỗi Unicode 'u '...''. Vui lòng thêm điều đó vào ví dụ của bạn và nhận xét về nó. –

+0

Cảm ơn bạn S.Lott, đây là nó. Bây giờ tôi đã hiểu lỗi của tôi ở đâu. ''{id}, {name}'' là một chuỗi utf-8 (được xác định bởi * dòng ma thuật * '# encoding: utf-8') và' n' ở dạng unicode. Không thể "nối" chúng được. Đó là lý do tại sao 'n.encode ('utf8')' hoạt động. Đúng? – Aufwind

Trả lời

10

Bạn đang sử dụng string.format trong khi bạn không có chuỗi nhưng đối tượng unicode.

print u'{id}, {name}'.format(id=i, name=n) 

sẽ hoạt động, vì nó sử dụng unicode.format thay thế.