Ver Mensaje Individual
  #1 (permalink)  
Antiguo 13/02/2007, 17:48
ilichmx
 
Fecha de Ingreso: noviembre-2004
Mensajes: 38
Antigüedad: 20 años
Puntos: 0
Solucion definitiva sobre ACENTOS

Bueno aquí les vengo a dejar un post de cómo pueden solucionar un tema que veo que se complica un poco la vida…

Bueno comenzando

Nos preguntamos la cuestión de los acentos y caracteres raros cuando enviamos y recibimos a través de AJAX, pero bueno antes que nada veamos un poco de lógica o historia documentada (como guste verla).

Cita:
Sabemos que parte de la programación es saber distinguir lo que son cadenas con caracteres de programación y mas para esto se idearon varios grupos de caracteres (para las cadenas) según para esto un mejor entendimiento y mas como en el mundo hablamos diferentes idiomas y cada una tiene sus características. Antes que nada recuerdo que hasta inicios de los 90, todo el mundo se ahorraba problemas escribiendo en los formularios TODO EN MAYUSCULAS y dejando a los NUNEZ igual que los NUNEZ. Claro, estábamos bajo el dominio del ASCII, que para los que no sepan, en un estándar que define la asociación entre un patrón digital y un carácter o glifo. En particular, los caracteres (letras y caracteres de control), ocupan 7 bit de información. Por tanto, existen 128 caracteres disponibles.

Si bien ASCII cuenta con caracteres "nacionales", como el tilde, el acento circunflejo y otros, se debían crear los caracteres imprimiendo el carácter original (la a), un retorno de carácter y el carácter nacional encima. Horrible.

Para solucionar esto, llego la norma ISO-8859, que define variados mapas de caracteres para distintos países. El que nosotros ocupamos es el infame ISO-8859-1, o Latin-1, una derivación de ISO 8859-1 (lean el artículo en la Wiki pedía para que sepan exactamente la diferencia) que cuenta con caracteres usados comúnmente en Albania, Catalán, Danés, Alemán, Inglés, Francés, Finlandés, Islandés, Irlandés, Italiano, Latín, Noruego, Portugués, Escocés, Suizo y, como no, Español.

Si bien este formato es el más extendido en la actualidad, siempre ha estado la inquietud de sacarse de encima todo el lío de los distintos set de caracteres, unificando todo en un único sistema de codificación. Esto lo ha logrado el estándar Unicode, una de cuyas implementaciones, el UTF-8, es la que predomina en GNU/Linux y en la red

UTF-8

UTF-8 (Formato de transformación Unicode de 8 bit) es una codificación de caracteres de largo variable. Usa grupo de bytes para representar el estándar Unicode para la mayoría de los lenguajes del mundo.

¿Cómo funciona? Primero, para los caracteres dentro del rango ASCII, ocupa sólo un bit de información por carácter. Para el resto, se pueden ocupar desde 2 a 4 bytes. Una de las gracias de esta codificación es que siempre el bit más significativo para cada carácter no ASCII siempre es 1, lo cual impide que aparezca entremedio un byte 0x00, lo cual sería fatal para cualquier aplicación C.

En resumen....

Existen diferentes formas de codificar los caracteres. Las más comunes en el habla hispana son el ISO-8859-1 y el UTF-8, siendo esta la forma preferida por su compatibilidad a futuro. Si una se equivoca en la codificación, las cosas se ven muy feas

Los caracteres en la web

En las páginas Web.

Para especificar el set de caracteres a utilizar tanto en HTML como en XHTML, se utiliza en el de la página el código

• <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Para UTF-8, o

• <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

Para ISO-8859-1 (Latin-1).

Como es de suponer, todo el contenido de la página tiene que estar EFECTIVAMENTE escrito en ese set de caracteres. Para hacer una prueba rápida, si están en Firefox, vayan a View->Character Encoding->Western (ISO-8859-1) y verán lo linda que se ve esta página (que está en UTF-8) con el set de caracteres equivocado.

XMLHttpRequest y UTF-8

Ahora viene lo bueno, chiquillos. El objeto XMLHttpRequest, básico para el uso de Ajax, SIEMPRE ocupa UTF-8 para enviar y recibir datos. Punto.
¿Por qué, entonces, muchas de las herramientas para Ajax funcionan extraño con los caracteres?.

Si enviamos un contenido por POST, este va a ser enviado siempre por UTF-8, pero si lo envíanos por GET, será codificado en ISO-8859-1 en Mozilla y en UNICODE en IE, usando la función escape

La función encodeURI y encodeURIComponent, tanto en IE, como en Mozilla envía la representación UTF-8

Tanto rollo para esto? Es que una cosa es cierto si no sabemos como funciona las cosas no podemos saber donde esta el error… así podemos ver, meditar y solucionar las cosas.

Solucion

¿Pero la solución practica? Bueno si lo vemos así hay que hacer dos tipos de AJAX uno para Mozilla y otro para IE, . Pero NO!! Digo somos programadores, no vamos a cambiar nuestros script si no mejor hacemos un parche y lo ejecutamos.

Viendo todo esto es mejor procesar los datos del lado del servidor así no dependemos del cliente, así que no hay que mover nada en el AJAX. En este caso usare PHP

Así que tenemos dos casos, enviar y recibir información.

Recibir información

Basta con solo pegar esta línea en el archivo de PHP que nos dara la información.

Código PHP:
header("Content-Type: text/html; charset=iso-8859-1"); 
Ahora para enviar informacion (usando metodo POST)

Hay que procesar las variables, separarlas, codificarlas y unirlas y así para no mover nada de nuestros script de PHP. Hice esta función, pegala al principio de cada archivo donde recibimos información con AJAX.


Código PHP:
    $variables array_keys($HTTP_POST_VARS);
    
$valores array_values($HTTP_POST_VARS);
    
    for(
$a=0;$a<count($valores);$a++){
        
$valores[$a] = utf8_decode($valores[$a]);
    }

    for(
$a=0;$a<count($valores);$a++){
        
$cadena $variables[$a];
        $
$cadena $valores[$a];
    } 
sin tener que mover nuestras variables y nada...
Y tenemos ya todo resuelto con los acentos y caracteres raros con AJAX…
Espero que les sirva esta información.