[Python-es] Problema codificación con .title() en Python2

Chema Cortes pych3m4 en gmail.com
Sab Jun 8 03:46:55 CEST 2013


El día 6 de junio de 2013 22:28, Alejandro Druetta
<aledruetta en gmail.com> escribió:
> Hola Guillermo, gracias por tu ayuda.
>
> En realidad, si en el código original sustituyes title por capitalize,
> funciona perfectamente, no hace falta cambiar nada más. Mi duda era cómo
> hacer funcionar title, que es lo que está dando problemas por el tema de la
> codificación.

Habría que empezar distinguiendo tres codificaciones:

- la que usa el fichero de código
- la que usa la cónsola donde sacas el texto
- la codificación unicode nativa

La primera, que pones como cabecera del código, sirve para indicar la
codificación de las cadenas de texto a partir de las cúales
inicializas las variables unicode. Concretamente, en el código no
tienes ninguna, así que no influye en nada.

La segunda, la de la cónsola. De lo que cuentas es imposible saber
cuál usas, pero es posible determinar la que tiene el usuario de
'sys.stdout.encoding'. Todas tus cadenas deberían estar en esta
codificación, incluídas los "prompts" de raw_input.

La tercera, unicode nativa. Advertir que no es utf-8, ni utf-16, ni
utf-32 ... La codificación unicode está basada en códigos codepoints
que, de momento, ninguna cónsola sabe interpretar. Necesitamos
convertir las cadenas unicode a la codificación de la cónsola antes de
imprimirlas.

Para complicarlo un poco más, las funciones raw_input e input tienen
problemas para usar cadenas unicode como prompts.


La solución pasaría por usar siempre unicode en tus cadenas de texto y
tratar de codificarlas según necesite la cónsola de texto, que sería
algo así:

prompt = u"¿Cómo se escribe %s en %s: "% ( i, lengua )
palabra = raw_input(prompt.encode(sys.stdout.encoding)).decode(sys.stdin.encoding)


Refactorizando un poco, ésta sería una versión funcional:

http://pastebin.com/sj8Uu6ZB


--
Hyperreals *R: http://ch3m4.org/blog
Quarks, bits y otras criaturas infinitesimales


Más información sobre la lista de distribución Python-es