2011-12-22 10 views
7

Supongamos que¿Hay alguna diferencia entre `%` -format operator y `str.format()` en python con respecto a la codificación unicode y utf-8?

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

El primero de los siguientes archivos tiros

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

Cuando hago n.encode('utf8') funciona.

El segundo funciona sin defectos en ambos casos.

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

Dado que en la documentación que se anima a utilizar format() en lugar del operador % formato, no entiendo por qué format() parece más "handicaped". ¿Funciona format() solo con utf8 -cadenas?

+0

Cuando hiciste 'u '{id}, {name}'. Format (id = i, name = n)' ¿qué observaste? Tenga en cuenta que la cadena de formato es una cadena Unicode 'u '...''. Por favor, añádalo a sus ejemplos y coméntelo. –

+0

Gracias S.Lott, esto fue todo. Ahora entiendo dónde fue mi culpa. ''{id}, {name}'' era una cadena utf-8 (definida por la * línea mágica * 'codificación #: utf-8') y' n' estaba en unicode. No es posible "concatenarlos". Es por eso que 'n.encode ('utf8')' funcionó. ¿Derecha? – Aufwind

Respuesta

10

Está utilizando string.format mientras que no tiene una cadena sino un objeto unicode.

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

funcionará, ya que utiliza unicode.format lugar.

Cuestiones relacionadas