sábado, marzo 21, 2009

Encoding en Python

Hace algún tiempo atrás, en la lista de correos de Python-Dev, explicaban cuál es el algoritmo de detección de la codificación UNICODE en un stream de Python. Aquí la incluyo en castellano.
  • Si el IO es hacia una terminal, Python intenta determinar la codificación de dicha terminal. Esto es importante en Windows donde se utiliza la página de codifición OEM por defecto.
  • Si el IO es hacia un archivo, Python trata de de averiguar la codificación "común" del sistema. En Unix busca el locale y decae en ascii si el locale no está establecido. En Windows usa la página de codificación ANSI. En OSX usa la codificación del sistema.
  • Si el IO es binario, no se usa codificación. En IO sobre redes (por ejemplo, sockets) simpre es binario.
  • Para nombres de archivos, el algoritmo difiere. En Windows se usa la API de Unicode así que no es necesario ningún proceso de codificación extra. En Unix se usa el locale. En OSX se usa UTF-8, pero sólo para el primer argumento de open() NO para el stream resultante.