Búsqueda personalizada

sábado, 12 de julio de 2008

Solución a problema de los Charset con Ajax

Debido a que todo el mundo al iniciarse con Ajax o el simple uso del Objeto XMLHttpRequest se enfrenta con problemas de acentos “ñ” eñes y otros caracteres raros cuando se inserta o se extrae de la base de datos me motiva a postear algunas soluciones.

Breve explicación según mi criterio.

Tengo entendido que para solucionar el problema de las “ñ” y acentos en una página estática simplemente ponemos en el head de la pagina el siguiente código y basta

<head>

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

</head>

Pero resulta que cuando consultamos a la DB con la típica función Ajax siguiente

función nuevoAjax(){
var xmlhttp=false;
try{
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
}catch(e){
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}catch(E){
xmlhttp = false;
}
}
if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
xmlhttp = new XMLHttpRequest();
}
return xmlhttp;
}

Todo lo que hagas a través de la función anterior y mas específicamente si usas Firefox lo convertirá a UTF-8 para devolver los resultados entonces en el ejemplo siguiente lo que devuelvas del servidor “"../src/Funciones.php” sacado de la base de datos y que no desees que aparezca con caracteres raros lo debes englobar en .rawurlencode() en el caso de que sea PHP y cuando haces innerHTML en javascript debes hacer unescape al responseText como en el ejemplo siguiente

ajax=nuevoAjax();
ajax.open("POST", "../src/Funciones.php",true);

ajax.onreadystatechange=function(){
if (ajax.readyState==4) {
contenido.innerHTML= unescape(ajax.responseText) ;
}
}

ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
ajax.send("accion=continuarCurso&id_usuario="+id_usuario+"&id_curso="+id_curso);




En cambio cuando deseas enviar algo para que se guarde en la base de datos mediante ajax debes englobarlo en escape por lo menos mi me ha funcionado de esta manera
Tango en el envío como en el request de PHP en el ejemplo siguiente uso escape enviar con ajax y rawurldecode() en php para volver a capturar lo que quiero guardar correctamente las palabras en la base de datos

ajax.send("accion=crearCurso&id_usuario=”+id_usuario+”idioma="+escape(idioma)+"&idiomas="+escape(idiomas)+"&descrip="+escape(descrip)+"&creador="+escape(creador)+"&porc="+porc+"");

y la funcion que recibe en php lo inverso a la forma de sacar rawurldecode()


$idioma = rawurldecode ($_REQUEST['idioma']);
$idiomas = rawurldecode ($_REQUEST['idiomas']);
$descrip = rawurldecode ($_REQUEST['descrip']);
$creador = rawurldecode ($_REQUEST['creador']);
$porc = $_REQUEST['porc'];
$id_usuario = $_REQUEST['id_usuario'];

$conexion = new ConexionMy();
$sql = $conexion->ejecutar("insert into cursos(id_curso, idioma, a_idioma, descripcion, estado, creador, porc_aprob, id_usuario
)values(default, '$idioma', '$idiomas', '$descrip', 'Pendiente', '$creador', $porc, $id_usuario)");

echo "Curso guardado puede agregar modulos e items a los modulos --->$idiomas";



No se si esta es la mejor forma de hacerlo o la mas correcta pero lo que si se es que funciona espero que le sirva a alguien
Gracias.

5 comentarios:

Unknown dijo...

Gracias, me sacó de un apuro....

Unknown dijo...
Este comentario ha sido eliminado por el autor.
Unknown dijo...

Gracias, pero tengo un problema en la línea de mi script .js

Yo tengo esto:
ajax.send(null);

del resto esta todo igual como lo sugieres

ahora para mostrar consulta desde la bd

con tu ultima linea es esta:

ajax.send("accion=continuarCurso&id_usuario="+id_usuario+"&id_curso="+id_curso);

y la mia es esta y no se como hacerlo, pues tengo en mi tabla glosario los campos a continuación:
count, id_usuario, palabra, signifcado y fecha de registro

como lo haria?

Gracias!

DA Super Star dijo...

Muchas gracias por tu aporte.

Tengo un sistema de comentarios en un sistema (valga la redundancia ja) y en la base de datos los comentarios se guardaban mal desde que empecé a usar AJAX.

La solución fue (creo) que mucho más simple que como lo planteaste:

Solo usé "escape()" en los datos que recibe AJAX al momento de guardar. De esta forma se guarda como corresponde en la base de datos y por lo tanto después se muestran bien.

Gracias por compartir tus conocimientos.
Te dejo uno de mis proyectos:

www.24tiempos.com.ar

Saludos!

D.A.

DA Super Star dijo...
Este comentario ha sido eliminado por el autor.