La codificación de caracteres en Python

Cuando escribimos un script en Python y éste contiene cadenas de caracteres que no están escritas en inglés, es posible que éstas contengan caracteres que no se encuentran entre los definidos por el ASCII. En este caso, si no se le dice a Python cómo debe tratarlas, éste se queja.

Tomemos, por ejemplo, este script que tan sólo muestra en pantalla una cadena de texto:

PYTHON:
  1. #!/usr/bin/env python
  2.  
  3. # Las tildes no están a salvo en los comentarios
  4. print "Las tildes no están a salvo en las cadenas de texto"

Si ejecutamos este script tal como está ahora, tendremos una desagradable sorpresa:

jake@aurora /tmp $ chmod u+x encoding.py
jake@aurora /tmp $ ./encoding.py
sys:1: DeprecationWarning: Non-ASCII character '\xc3' in file ./encoding.py on line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
Las tildes no están a salvo en las cadenas de texto

La URL que devuelve el intérprete corresponde a una propuesta de extensión de Python (PEP), aceptada hace tiempo, que indica cómo especificar la codificación de caracteres no ASCII.

Básicamente, lo que dice es que Python interpreta todo como ASCII a menos que se le indique lo contrario con un comentario especial que tiene que estar en la primera o la segunda línea y debe casar con la expresión regular: coding[:=]\s*([-\w.]+). Esto significa que si usas Vim o emacs para editar el código python puedes utilizar la sintaxis propia de cada uno para indicarle al editor la codificación del archivo y así matar dos pájaros de un tiro. Además, como bien dice el artículo, se puede usar incluso el lenguaje natural; podría escribir:

PYTHON:
  1. #!/usr/bin/env python
  2. # Este archivo usa el encoding: utf-8
  3.  
  4. # Las tildes no están a salvo en los comentarios
  5. print "Las tildes no están a salvo en las cadenas de texto"

Aunque yo prefiero usar la sintaxis de Vim, que es, dicho sea de paso, mi editor favorito ;)

PYTHON:
  1. #!/usr/bin/env python
  2. # vim: set fileencoding=utf-8 :
  3.  
  4. # Las tildes no están a salvo en los comentarios
  5. print "Las tildes no están a salvo en las cadenas de texto"

Y si ejecutamos esta nueva versión vemos que ahora no hay quejas:

jake@aurora /tmp $ ./encoding.py
Las tildes no están a salvo en las cadenas de texto

Esta entrada se publicó el Jueves, 1 de Febrero de 2007 a las 12:26 am y está archivada en Programación con estos tags o etiquetas: . Puedes seguir las respuestas a esta entrada mediante el feed RSS 2.0. Puedes dejar dejar un comentario, o hacer trackback desde tu propia web.

4 Comentarios to “La codificación de caracteres en Python”

Me encanta esa forma de poner los trocitos de código con la sintaxis resaltada, ¿cómo lo haces?
Está mucho mejor que un pantallazo del Vim :-D

Utilizo un plugin llamado iG:Syntax Hiliter. Está muy bien porque está basado en el motor GeSHi, y eso permite aprovechar muchísimas definiciones de resaltado de lenguajes, pero no me termina de convencer el botón de PLAN TEXT, porque se come las líneas vacías y los espacio de principio de línea de modo que puede dejar inservible un código que, por ejemplo, esté escrito en Python*. Quizá no sea muy complicado de codificar, o puede que ya lo hayan corregido, pero ese será un tema de trabajo para una tarde de verano.

Bueno, también podría decir las palabras mágicas: Es una pena que nadie haya arreglado esto :D

* Nota para los que no son Pythonisos: En python la indentación forma parte de la sintaxis.

sin risas por favor

No soy capaz de encontar la forma de poner el caracter que es igual a una “u”, pero con forma cuadrada, que hace de espacio entre las palabras.

me podeis ayudar

roberto, aunque la relación con el artículo es… escasa, he buscado un poco y he encontrado que el carácter que buscas es, según unicode, el BOTTOM SQUARE BRACKET, con código U+23B5. Puedes ver aquí una ficha del carácter ⎵. El problema es que necesitas tener una tipografía que lo incluya entre su símbolos, puedes ver aquí una lista de tipografías que incluyen el carácter U+23B5.

Espero haber sido de ayuda.

Tu comentario





Los campos en negrita son obligatorios. Las direcciones de email nunca se publican ni se distribuyen.

Se permiten algunas etiquetas de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong> . Las URIs deben ser completas (p. ej.: http://www.domainname.com) y todas las etiquetas deben cerrarse correctamente.

Los saltos de línea y los párrafos se forman automáticamente.

Por favor, escribe comentarios mínimamente relevantes. Los comentarios ofensivos, inapropiados o fuera de tema pueden ser editados o borrados.

Buscar

Posts recientes

  1. Structs, tipos y listas enlazadas
  2. Opciones en las direcciones de Gmail
  3. Python en Windows sin ventana de DOS
  4. Problemas al compilar blas-atlas en Gentoo
  5. La codificación de caracteres en Python
  6. Comprobaciones de particiones en el arranque
  7. Cuidado con Ubuntu en los portátiles Dell
  8. Escoger el orden de tarjetas de sonido con Alsa en Ubuntu
  9. Actualización de Ubuntu: de Dapper a Edgy
  10. ¡Hola mundo!


Licencia de contenidos

Todo el contenido original creado por Jacobo de Vera y que aparece en este sitio web se encuentra, si no se indica lo contrario, protegido por una licencia de Creative Commons.

DreamHost promo

DreamHost

Esta web está alojada en uno de los servidores de DreamHost.

Si buscas alojamiento para tu web quizá te interesen sus precios.

Si te decides y quieres obtener un descuento de 45.00$ en cualquiera de los planes anuales o bienales introduce este código de promoción en el formulario de alta:

JOV042