Está en la página 1de 4
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 Hexadecimal Windows-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- Un problema frecuente es enviar respuestas HTTP sin especificar en ningin sitio la codificacién utilizada. Cuando se da el caso, el cliente que recibe la respuesta tiene que determinar la codificacién que utilizaré para decodificar el contenido. Habitualmente, es tan sencillo como que el cliente utilizaré la codificacién predeterminada del sistema operativo, por lo que existe un elevado riesgo de que en algun cliente con una determinada configuracién se muestre incorrectamente. 3) Otro problema con el que me he encontrado en varias ocasiones es relativo al dialogo de descarga de Internet Explorer. Cuando generamos una respuesta HTTP dinamicamente desde ASP.NET para enviar un fichero, podemos encontrarnos con que el dialogo de descarga muestra el nombre del fichero con caracteres incorrectos: Name: Diseiito arBifica. docx Type: Unknown File Type, §1,8KB From: localhost Ge harm your computer. I you da not rust the source, do nat save this @ While files from the Intemet can be useful, some files can potentially fle, Whats the risk? Este problema se debe a que ASP.NET (1.1 y 2.0) por defecto codifican los encabezados HTTP con UTF-8. En ASP.NET 1.1 es necesario instalar la siguiente actualizacién para poder especificar la codificacién de los encabezados: FIX: The response header will always be encoded as UTF-8 when you use the Response.Addheader method in ASP.NET Una vez instalada la actualizacién, podemos especificarla en el web.config de la aplicacién En ASP.NET 2.0 se puede cambiar la codificacién de los encabezados HTTP programaticamente ademas de mediante la opcién del web.config (igual que en ASP.NET 1.1): protected void Page_Load(object sender, fyentrgs e) { //Leemos el fichero DOCX y lo almacenamos en un array de bytes string FileName = "Disefio grafico.docx"; string FilePath = MapPath(FileName) ; byte[] FileBytes = © lc.ReadAllBytes(FilePath) //ASP.NET codifica los encabezados HTTP con ‘utf-8' de forma //predeterminada. Especificamos que utilice la codificacién //ANSI predeterminada del OS, que en mi caso es ‘Windows-1252' Response.HeaderEncoding = System.Text./)coding.Default; //Establecemos el MIME type de la respuesta y afiadimos el //encabezado HTTP ‘Content-Disposition’ } Response.ContentType = "application/docx; charset=utf- Response.AddHeader("Content-Disposition", “Inline; filenames" + FileName) ; //Enviamos el fichero en formato binario Response. BinaryWrite(FileBytes) ; Hasta el préximo post - Daniel Mossberg Comments © So Dee 2009 808 AM ec e Me estimadicimo Daniel Mossberg eres muy cabron Ilevaba 3 dias con este problema y ti post es el mejor y mas respetable indagaste hasta en el webconfig todos mis respetos y admiracion por tu trabajo espero que sigas enalteciendo esta hermosa profesion del desarrollo gracias. @ | cxolina 13 May 2012 3:37 PM Muchas gracias por la informacién, el paso 2 me ayudé a solucionar mi problema. Saludos Lazaro 2 Apr 2013 5:51 PM Hola Daniel Perdén por revivir este tema, pero una vez que lo ponga todo con utf-8 como debo poner las fi dentro de un Las pongo asi tal cual o debo usar las referencias tipo á ? Si puedes porfa una respuesta a Lmsantin@yahoo.es

También podría gustarte