Encoding types con IIS y ASP.NET

¿Te ha sucedido alguna vez que hayas hecho una página, tú la veas perfectamente, y vayas a continuación a otro ordenador, o que la subas al servidor de producción y que los acentos, eñes y otros caracteres especiales se vean con símbolos extraños?

Con toda seguridad esto se deba a un incorrecto uso de la codificación, bien de la página o del servidor.

Actualmente con el fin de dar soporte al gran abanico de diferentes idiomas, cada uno con características muy especiales de caracteres o símbolos, existen diferentes formas de codificación. Para representar este gran abanico ya no es suficiente con los 8 bits tradicionales con los que se codificaba antiguamente cada carácter, por lo que hay diferentes sistemas y para saber cuál utiliza un archivo concreto, los primero caracteres del archivo suelen indicar la codificación.

Cuando el navegador de un usuario recibe una página web tiene que saber en qué codificación la recibe para poder mostrársela al usuario. Para ello los navegadores tiene diferente información en la que basarse: la información de la etiqueta meta correspondiente en el contenido de la página, pueden utilizarse los primeros caracteres de la página si representan una codificación, o puede recibirse una cabecera indicando la codificación del contenido.

Suele utilizarse esta información y en ese mismo orden, ya que la información de los metas o la codificación de los archivos puede gestionarse a nivel de web normalmente, pero hay otra información como las cabeceras de codificación que envía el servidor web que se configurar a nivel de servidor y puede ser que no tengamos posibilidad de configurarlas.

Respecto a las dos primeras opciones, no todos los navegadores lo hacen en el mismo orden ya que hay algunos que dan prioridad a los metas sobre el código de codificación, y otros que hacen lo contrario.

En el caso de IIS y ASP.NET dentro del archivo de configuración Web.config se puede utilizar una etiqueta en la sección system.web con nombre globalization que nos permite indicar a ASP.NET que codificación debe utilizar para servir las páginas. Por defecto es UTF-8, por lo que si queremos servir páginas codificadas con Latin-1 podríamos utilizar:

<globalization requestEncoding="iso-8859-15" responseEncoding="iso-8859-15" />

Con ello hemos configurado para que el html que devuelva el servidor para esta aplicación lo haga como ISO-8859-15 (el 15 es equivalente al 1 pero incluye el símbolo de euro €).

En el caso de que queramos servir también información de meta con la codificación deberíamos hacer que coincidiera con ésta, ya que como hemos visto, algún navegador podría darle más prioridad y mostraría los caracteres especiales de forma incorrecta. En estos casos es posible utilizar el menú de “Ver >> Codificación” que suelen tener los navegadores, para comprobar que codificación está utilizando el navegador para mostrar la página, ver si coincide con la que le hemos indicado, y seleccionar otra para hacer pruebas y detectar cuál puede ser el problema.

Twitter Digg Delicious Stumbleupon Technorati Facebook Email

2 Respuestas para “Encoding types con IIS y ASP.NET”

  1. Otro problema que se ha dado es que si utilizas javascript que están en ISO (con sus acentos) y en el web.config pones codificación UTF-8, las páginas ASPX empiezan a fallar.

    Esto es porque los javascript que están incluidos con script src tienen otra codificación. Solución, pasar todos los JS a UTF-8, pero si tienes 800 javascript se hace dificil.

    Lo mejor es en el javascript no poner nunca acentos ni ñ, o sea fuera castellano. Lo cual queda poco elegante.

    La solución temporal que adopté es seguir con ISO, pero creo que euro no saldría. De momento sigue así, hasta el día del juicio final.

  2. Respecto a lo que comentas del euro, para que se muestre el simbolo tienes que utilizar el ISO-8859-15.

    Aparte si lo que necesitas es referenciar en tus paginas aspx archivos JavaScript que estan en otro encoding diferente, puedes utilizar el atributo charset del tag script, por ejemplo:

    <script type=”text/javascript” charset=”ISO-8859-15″ src=”utils.js”></script>

    A ver si te funciona