Acentos y efies no se muestran
correctamente
Daniel Mossberg 1 Dec 2009 3:15 AM 3
Los ordenadores procesan texto utilizando tablas de codificacién para convertir secuencias de bits
en caracteres alfanuméricos y viceversa. Cuando desarrollamos aplicaciones, y muy especialmente
aplicaciones distribuidas o aplicaciones web, tenemos que tener en cuenta la codificacién (0
enconding) con la que “ciframos” y “desciframos” los mensajes, dado que si utilizamos
codificaciones distintas el mensaje resultante puede resultar incorrecto.
Antes de meternos de lleno en las consideraciones especificas de desarrollo, revisemos brevemente
los encodings mas comunes que puede ser interesante conocer.
ASCII
ASCII (American Standard Code for Information Interchange) se desarrollé en los afios 60 y es una
tabla de codificacién que utiliza 7 bits para representar 128 caracteres, de los cuales 94 son
caracteres Jegibles y 33 son caracteres de control y el espacio que se considera un caracter invisible.
Esta codificacién no sirve para representar la ‘fi’ o los acentos, y hoy en dia en muchos contextos se
considera obsoleta.
Windows-1252 (Western European)
Historicamente era la codificacién predeterminada en muchos contextos de Windows. Es una
codificacién de 8 bits para representar 256 caracteres, e incluye la mayoria de los caracteres
utilizados en los alfabetos de Europa occidental.
1S0-8859-1 (Latin 1)
Esta codificacién ISO de 8 bits fue publicada en 1985, y es un subconjunto de la codificacién
Windows-1252 compuesto por 191 caracteres. Es informalmente conocida como Latin 1.
1S0-8859-15 (Latin 9)
En 1999 se publicé esta codificacién como una actualizacién de /SO-8859-1 para corregir algunas de
sus limitaciones. Sigue utilizando 8 bits para representar cada cardcter, y entre otros cambios se
afiadieron algunos caracteres del alfabeto fines (8 y 2), y el simbolo del euro (€). Para poder
acomodar estos cambios, se tuvieron que eliminar algunos otros caracteres de uso poco frecuente,
entre los cuales se encontraban: #, |, ",", %, %, y %.
UTF-8
UTF-8 (8-bit Unicode Transformation Format) es una codificacién de longitud variable entre 1 y 4
bytes. La representacién de un byte (8 bits) de UTF-8 se reserva exclusivamente a los 128
caracteres de la tabla ASCII lo cual lo hace compatible hacia atrds. Los siguientes 1920 caracteres de
UTF-8 requieren dos bytes para ser codificados, entre los cuales se incluyen el alfabeto latino,
griego, cirilico, hebreo, arabe, sitio, etc.
Por lo tanto, la moraleja de este breve resumen, es que aunque tanto Windows-1252 y UTF-8 sean
capaces de representar el carécter ‘N’, lo hacen de forma distinta. De hecho, para ser més precisos
lo hacen asi:
Codificacién Glifo__| Representaci6n Binaria Representacién HexadecimalWindows-1252
1101001 D1
UTF-8
1100011 10010001 391
Por lo tanto, queda claro que si codificamos un texto utilizando Windows-1252 y posteriormente lo
decodificamos los bytes resultantes utilizando UTF-8, lo que inicialmente era un ‘N’ va a pasar a ser
cualquier otra cosa excepto una ‘Nal decodificarlo.
Ahora que ya tenemos més clara la problematica, os detallo algunas consideraciones concretas
para ASP.NET:
1) Dado que ASP.NET nos permite configurar la codificacién utilizada para generar las
respuestas, y la codificacién predeterminada para decodificar las peticiones, es importante
asegurarse de que se utiliza la misma codificacién en la otra parte implicada, el cliente. Esta es
la configuracién predeterminada de ASP.NET:
2) Enuna respuesta HTTP podemos especificar la codificacién del contenido en dos sitios. En
el encabezado HTTP Content-Type o en un meta tag dentro del propio documento HTML. En
caso de conflicto entre ambos (como en el ejemplo), tiene preferencia la configuracién
especificada en el encabezado HTTP.
HTTP/1.1 200 OK
Date: Tue, 1 Dec 2009 10:23:34 GMT
Server: Microsoft-IIS/6.@
Content-Length: 48
Content-Type: text/html; charset=utf-8
Cache-control: private
http: //www.w3.org/1999/xhtm1">
Content-Type" content="text/html; charset=IS0-