2011-12-22 11 views
7

Załóżmy, żeCzy istnieje różnica między `%` -format operator i `str.format()` w python dotyczące kodowania Unicode i utf-8?

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

Pierwszy z następujących plików rzuca

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

Kiedy zrobić n.encode('utf8') to działa.

Drugi działa bez zarzutu w obu przypadkach.

# 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) 

Ponieważ w dokumentacji jest zachęcani do korzystania format() zamiast operatora formacie %, nie rozumiem dlaczego format() wydaje się bardziej „handicaped”. Czy format() działa tylko z utf8 -strings?

+0

Kiedy zrobiłeś "u" {id}, {imię} ". Format (id = i, name = n)" co zaobserwowałeś? Zauważ, że ciąg formatujący to ciąg znaków Unicode "u" ... ". Dodaj to do swoich przykładów i skomentuj to. –

+0

Dziękuję S.Lott, to było to. Teraz rozumiem, gdzie moja wina. '' {id}, {name} ''był łańcuchem utf-8 (zdefiniowanym przez * magic line *' # encoding: utf-8') i 'n' był w unicode. Nie można ich "złączyć". Właśnie dlatego zadziałał 'n.encode ('utf8'). Dobrze? – Aufwind

Odpowiedz

10

Używasz string.format, gdy nie masz obiektu tekstowego, ale obiekt unicode.

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

będzie działać, ponieważ używa zamiast niego unicode.format.

Powiązane problemy