miércoles, mayo 18, 2011

Python, Genshi, fechas y UnicodeDecodeError

Hace unas semanas agregué el locale es_MX.UTF-8 para publicar fechas en español. Me llevó poco más de una hora descubrir un error en una aplicación que había funcionado perfectamente ayer. Los errores de python no siempre son los más claros.

La causa, 'UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 2: ordinal not in range(128)', yo creo el error más odiado para los hispano parlantes de python. La función que uso para publicar la fecha de hoy en Genshi es:
...
<link rel="stylesheet" type="text/css" media="screen" href="${tg.url('/css/tables.css')}" />
</head>
<?python
import locale
locale.setlocale(locale.LC_ALL, 'es_MX.utf8')
import datetime
?>
<body>
 <div id="wrap">
  <h2>
  Cotizaci&oacute;n
   <span>${datetime.datetime.now().strftime("%a %d de %B del %Y").upper()}</span>
  </h2>
  <div id="navcontainer">
...

Nunca se me ocurrió que tenía que preocuparme por días como hoy, Miércoles.
La función queda así:
...
<link rel="stylesheet" type="text/css" media="screen" href="${tg.url('/css/tables.css')}" />
</head>
<?python
import locale
locale.setlocale(locale.LC_ALL, 'es_MX.utf8')
import datetime
?>
<body>
 <div id="wrap">
  <h2>
  Cotizaci&oacute;n
   <span>${datetime.datetime.now().strftime("%a %d de %B del %Y").decode('utf-8').upper()}</span>
  </h2>
  <div id="navcontainer">
...


Agregar .decode('utf-8') funciona la mayoría de las veces que se presenta el UnicodeDecodeError.

No hay comentarios.: