La forma correcta de imprimir caracteres Unicode en la consola en Python cuando se utilizan scripts en línea

Estoy buscando una forma de imprimir caracteres Unicode en una consola Linux compatible con UTF-8, utilizando el método de print Python 2.x.

Lo que obtengo es:

 $ python2.7 -c "print u'é'" é 

Lo que quiero:

 $ python2.7 -c "print u'é'" é 

Python detecta correctamente que la consola está configurada para UTF-8.

 $ python2.7 -c "import sys; print sys.stdout.encoding" UTF-8 

He mirado 11741574 , pero la solución propuesta utiliza sys.stdout , mientras que estoy buscando una solución con print .

También miré el 5203105 , pero usar el método de encode no soluciona nada.

 $ python -c "print u'é'.encode('utf8')" é 

Soluciones

Según lo sugerido por @KlausD. y @itzmeontv

 $ python2.7 -c "print 'é'" é 

Según lo sugerido por @ PM2Ring

 $ python -c "# coding=utf-8 > print u'é'" é 

Consulte la respuesta aceptada para obtener una explicación sobre la causa del problema.

El problema no es imprimir en la consola, el problema es interpretar el argumento -c desde la línea de comando:

 $ python -c "print repr('é')" '\xc3\xa9' # OK, expected byte string $ python -c "print repr('é'.decode('utf-8'))" u'\xe9' # OK, byte string decoded explicitly $ python -c "print repr(u'é')" u'\xc3\xa9' # bad, decoded implicitly as iso-8859-1 

Parece que el problema es que Python no sabe qué encoding están usando los argumentos de la línea de comandos, por lo que obtienes el mismo tipo de problema como si un archivo de código fuente tuviera la encoding incorrecta. En ese caso, le diría a Python qué encoding de la fuente se usó con un comentario de coding , y también puede hacerlo aquí:

 $ python -c "# coding=utf-8 print repr(u'é')" u'\xe9' 

Sin embargo, generalmente trato de evitar Unicode en la línea de comandos, especialmente si alguna vez tienes que ejecutar Windows donde la historia es mucho peor.

Esto es feo, debido a los problemas mencionados por Bobince.

Pero puede obtener lo que quiere diciéndole a Python que el carácter que está pasando desde la consola en realidad está codificado en iso-8859-1 también conocido como latin-1 .

 $ python -c "s=u'é';print unicode(s.encode('iso-8859-1'), 'utf-8')" é $ python -c "s=u'é';print unicode(s.encode('latin-1'), 'utf-8')" é 

Intenta esto si quieres imprimir en consola

 python -c "print 'é'" é