Foros del Web » Programando para Internet » Javascript » Frameworks JS »

Solucion definitiva sobre ACENTOS

Estas en el tema de Solucion definitiva sobre ACENTOS en el foro de Frameworks JS en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 13/02/2007, 17:48
 
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.
  #2 (permalink)  
Antiguo 14/02/2007, 11:38
Avatar de MaBoRaK  
Fecha de Ingreso: abril-2003
Ubicación: La Paz - Bolivia
Mensajes: 2.003
Antigüedad: 21 años, 6 meses
Puntos: 35
Re: Solucion definitiva sobre ACENTOS

loading.............

Interesante :D

pero también es bueno añadir que para evitarse problemas con acentos y otros desde javascript formatear la cadena con encodeURIComponent(cadena);

también que DESACONSEJO MUCHISMO trabajar con iso-8859-1 porque recuerda que un html con header utf-8 te soportará caracteres por demás raros (idiomas).

Entonces la solucion mas alla de codificar a utf8 nuestra cadena de respuesta estaría en cambiar los header y toda la Aplicación Web a utf-8 de esta forma la hacen mas portable.

Ahora bien porque cuando nuestra aplicacion es completa en utf-8 tenemos caracteres jodidos en nuestros RESPOSETEXT desde que interactuaron con la base de datos?

SENCILLO: tu base de datos tiene por defecto la codificacion latin1 ... y no utf-8 por lo que debes poner utf8_decode($string) a la cadena que almacenaras en la base de datos.

y para volver a mostrar correctamente los caracteres utf8_encode($string); ... entonces a donde nos lleva todo esto? a TRABAJAR SIEMPRE CON utf-8 en la aplicacion y en la Base de Datos.

connection closed.
__________________

Maborak Technologies

Última edición por MaBoRaK; 14/02/2007 a las 11:44
  #3 (permalink)  
Antiguo 14/02/2007, 15:54
 
Fecha de Ingreso: noviembre-2004
Mensajes: 38
Antigüedad: 20 años
Puntos: 0
Re: Solucion definitiva sobre ACENTOS

Efectivamente MaBoRaK, eso es uno de los errores mas comunes ya que desde la version mysql creo que 4.2 para arriba se usa latin1 una de las derivaciones del ISO... con tu post ahora si ya se completo este tema... jajajaja. asi que lo mas consejable es usar UTF-8.

Para los que tenga tiempo pueden usar el metodo de modificar el javascript y para los flojos (como yo) modifico el proceso del lado del server.

Entonces cual usar?

El que mas te se haga facil, yo puse un ejemplo en PHP... pero en asp,jsp o su equivalencia que haya en el mercado me imagino que se podra.. pero a veces procesamos datos de html simples ahi es como nos preguntamos? simple usar el metodo de MaBoRaK... asi que ya hay respuesta por ambos lados.
  #4 (permalink)  
Antiguo 20/02/2007, 12:14
 
Fecha de Ingreso: junio-2006
Mensajes: 89
Antigüedad: 18 años, 5 meses
Puntos: 0
Re: Solucion definitiva sobre ACENTOS

Y los que usamos ASP, cual seria el homologo de utf_encode y utf_decode ?

saludos
  #5 (permalink)  
Antiguo 21/02/2007, 16:20
Avatar de stock  
Fecha de Ingreso: junio-2004
Ubicación: Monterrey NL
Mensajes: 2.390
Antigüedad: 20 años, 4 meses
Puntos: 53
Re: Solucion definitiva sobre ACENTOS

Cita:
Iniciado por MaBoRaK Ver Mensaje
Entonces la solucion mas alla de codificar a utf8 nuestra cadena de respuesta estaría en cambiar los header y toda la Aplicación Web a utf-8 de esta forma la hacen mas portable.
Mmmmmmm..... no estoy del todo deacuerdo contigo.... pues al utilizar utf-8 al validar tus documentos, el validador te marca esos errores, si, tu documento muestra correctamente los acentos, pero no estara validado, hasta que utilices la codificacion correcta

have funnnnnnnnnnn
  #6 (permalink)  
Antiguo 24/02/2007, 14:11
Avatar de NzO
NzO
 
Fecha de Ingreso: abril-2005
Mensajes: 153
Antigüedad: 19 años, 7 meses
Puntos: 3
Re: Solucion definitiva sobre ACENTOS

Yo no se si vosotros habeis llegado a hacer la prueba pero si con ajax envias esta cadena por post introducido en un input:
áéíóúÁÉÍÓÚñÑ

por mucho encode o encodeURIComponet que le pases. A mí siempre me devuelve esto:
áéíóú�É�ÓÚñÑ

Es posible que no lo veais a simple vista a la hora de recibirlo. Pero si lo ingresais en una BD vereis que es cierto lo que digo.

Así que siento decir que esa no es la solucion definitiva, nop.
__________________
NzO=EnZo
isiAJAX & isiXML hechos el uno para el otro.

Última edición por NzO; 24/02/2007 a las 14:21
  #7 (permalink)  
Antiguo 01/03/2007, 08:39
 
Fecha de Ingreso: febrero-2007
Ubicación: vivo en una ciudad pequeñ
Mensajes: 8
Antigüedad: 17 años, 8 meses
Puntos: 0
Re: Solucion definitiva sobre ACENTOS

Cita:
Iniciado por MaBoRaK Ver Mensaje
loading.............

Interesante :D

pero también es bueno añadir que para evitarse problemas con acentos y otros desde javascript formatear la cadena con encodeURIComponent(cadena);

también que DESACONSEJO MUCHISMO trabajar con iso-8859-1 porque recuerda que un html con header utf-8 te soportará caracteres por demás raros (idiomas).

Entonces la solucion mas alla de codificar a utf8 nuestra cadena de respuesta estaría en cambiar los header y toda la Aplicación Web a utf-8 de esta forma la hacen mas portable.

Ahora bien porque cuando nuestra aplicacion es completa en utf-8 tenemos caracteres jodidos en nuestros RESPOSETEXT desde que interactuaron con la base de datos?

SENCILLO: tu base de datos tiene por defecto la codificacion latin1 ... y no utf-8 por lo que debes poner utf8_decode($string) a la cadena que almacenaras en la base de datos.

y para volver a mostrar correctamente los caracteres utf8_encode($string); ... entonces a donde nos lleva todo esto? a TRABAJAR SIEMPRE CON utf-8 en la aplicacion y en la Base de Datos.

connection closed.
Es muy cierto lo que dices respecto a la BD de trabajar con iso-8859-1, pero sabes que la mayoria solo lo instala y nadie se preocupa de configurarlo. Pero bueno lo que yo llegue la conclusion es que la mayoria trabaja sin configurar nada, entonces por defecto trabajan con lo antes mensionado, entonces el PROBLEMA SE RESUME A ¿como mostrar bien la informcion? despues de lo mencionado anteriormente yo diria que a su script que utilizan para mostrar solo agreguen utf8_encode($string), y ya los datos saldran bien. Y mpor los antecedentes que mencione no necesitan el utf8_decode($string) para almacenar en la bd, si lo utilizan el problema persiste. Yo ya lo probe en IE y Mozilla y funciona de Peluches.
  #8 (permalink)  
Antiguo 05/03/2007, 14:06
 
Fecha de Ingreso: agosto-2003
Mensajes: 99
Antigüedad: 21 años, 3 meses
Puntos: 0
Re: Solucion definitiva sobre ACENTOS

Totalmente desesperado con este tema.
No consigo aclararme.

Tengo una llamada Ajax que me devuelve una estructura Json para despues usarla.

try{
var oXmlHttp = zXmlHttp.createRequest();
oXmlHttp.open("get", "seguridad/obt_menu.jsp?SF=333?>", false );
oXmlHttp.onreadystatechange = function () {
if (oXmlHttp.readyState == 4){
if (oXmlHttp.status == 200){
alert(oXmlHttp.responseText);

top.amenu = eval("[" + oXmlHttp.responseText + "];");
construyeMenu();
}else{
alert(oXmlHttp.statusText);
}
}
};
oXmlHttp.send(null);
}catch (oException) {
alert(oException.name + ': ' + oException.message);
}

la llamada mas sencilla del mundo.

La estructura Json generada es tipo:

{
"getCodGrp" : "1",
"getDesGrp" : "Alcorcón"
}

Bien, pues no os podeis ni imaginar la de problemas que me está dando ese acento... (esto unicamente es un ejemplo, pasa siempre con caracteres especiales, ya sabeis...).

El caso es que el xmlhttp no me devuelve correctamente los caracteres. si ejecuto el jsp desde un Ie a parte, la estructura es correcta y los caracteres especiales se pintan bien, pero desde el xmlhttp no unicamente que no se piten bien, sino que se corta el texto comiendose por ejemplo las " por lo que el posterior Eval peta.

He buscado en este foro, por internet etc... pero no encuentro nunguna solución para este caso. He probado en poner los metas
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

he probado de hacer el ejemplo en php porque he visto que habia mas soluciones y he conseguido ejecutarlo.

Por cierto he probado con el head y nada, tambien he probado en ordenadores/servidores totalmente diferentes y nada.

Alguien podria darme un poco de luz sobre el tema?

muchas gracias.
  #9 (permalink)  
Antiguo 05/03/2007, 14:17
 
Fecha de Ingreso: agosto-2003
Mensajes: 99
Antigüedad: 21 años, 3 meses
Puntos: 0
Re: Solucion definitiva sobre ACENTOS

Perfecto con el utf8_encode($desgrp) funciona en el php.

quedaria de la siuguiente manera:

{
"getCodGrp" : "<?=$codgrp?>",
"getDesGrp" : "<?=utf8_encode($desgrp)?>"
}

Alguien sabe si existe utf8_encode o similar en java?

gracias.
  #10 (permalink)  
Antiguo 27/03/2007, 19:05
Avatar de Viet  
Fecha de Ingreso: octubre-2003
Ubicación: Mar del Plata - Argentina
Mensajes: 247
Antigüedad: 21 años, 1 mes
Puntos: 2
Re: Solucion definitiva sobre ACENTOS

Buenas Justo estoy trabajando en un servlet en java y tengo problemas con los acentos y eñes...

he probado con

response.setContentType("text/html;");
response.setCharacterEncoding("iso-8859-1");

y tambien con Encoding("utf-8")

pero nada

alguno tiene idea????
__________________
Keep it simple and keep it fast.
  #11 (permalink)  
Antiguo 11/05/2007, 10:23
 
Fecha de Ingreso: junio-2005
Ubicación: Cucuta
Mensajes: 62
Antigüedad: 19 años, 5 meses
Puntos: 2
Re: Solucion definitiva sobre ACENTOS

Hola

yo lo soluciono así desde un servlet, igual funciona desde una jsp

response.setContentType("text/html;charset=ISO-8859-1");
request.setCharacterEncoding("UTF8");

Espero te sirva
  #12 (permalink)  
Antiguo 02/08/2007, 04:08
Bil
 
Fecha de Ingreso: noviembre-2006
Mensajes: 34
Antigüedad: 18 años
Puntos: 0
Re: Solucion definitiva sobre ACENTOS

Re: Solucion definitiva sobre ACENTOS


Buenos dias,
A mi me pasa lo mismo que al amigo NzO, alguien sabe porque sucede esto, y cual seria la solucion.
Incluso si hago encodeuri antes de enviar mediante ajax y luego lo guardo en la base de datos se me guardan bien los retornos de carro pero si no pongo lo del encodeuri no me guarda los retornos de carro. Y los acentos no funciona en ninguno de los casos.
Si alguien tiene una solucion. Todo esto son pruebas realizadas en ASP.

Yo no se si vosotros habeis llegado a hacer la prueba pero si con ajax envias esta cadena por post introducido en un input:
áéíóúÁÉÍÓÚñÑ

por mucho encode o encodeURIComponet que le pases. A mí siempre me devuelve esto:
áéíóú�É�ÓÚñÑ


Un saludo.
  #13 (permalink)  
Antiguo 28/01/2008, 06:24
Avatar de forecast  
Fecha de Ingreso: octubre-2004
Mensajes: 259
Antigüedad: 20 años, 1 mes
Puntos: 4
Re: Solucion definitiva sobre ACENTOS

Yo conseguí solucionar lo de los acentos en javascript de la siguiente manera...

Tenía un archivo javascript.js aparte y no me mostraba nunca los acentos de forma adecuada, en este archivo con Dreamweaver (es el editor con el que trabajo) >modificar>propiedades de la página>codificación del documento utf-8

Espero que pueda ser de ayuda.

Saludos.
  #14 (permalink)  
Antiguo 23/10/2008, 13:01
 
Fecha de Ingreso: octubre-2008
Mensajes: 1
Antigüedad: 16 años, 1 mes
Puntos: 0
De acuerdo Respuesta: Solucion definitiva sobre ACENTOS

SOLUCION A LOS ACENTOS Y Ñ ñ EN AJAX SI ME FUNCIONO ESPERO LES SIRVA



Les comento problema y mi solucion, espero les sirva a todos aquellos que tienen est problema espero no sea tarde.

Lei muchas cosas por alli unos decian que era la configuracion de la Base de datos que tenian que estar en UTF-8 tanto las paginas donde se presentaban la informacion como la base de datos, yo desarrollo paginas jsp la tengo con


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%> // esto es para los que desarrollan jsp



el meta de la pagina jsp la tengo asi

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



Al momento de presentar la informacion en la pagina las vocales con acentos o ñ Ñ las presentaba con cuadros o signos de interrogacion. Anteriormente el charset el pageEncoding los tenia con UTF-8 asi que al cambiarlo a ISO-8859-1 me resolvio el problema esto lo resolvio momentaneamente pero luego surgio el problema que al querer guardar la informacion la cual enviaba por ajax las guardaba con caracteres extraños cuadros o signos de interrogacion.



Despues tenia el problema de que queria enviar mucha informacion por un ajax todo estaba bien cuando enviaba poca pero cuando era demasiada el ajax me arrojaba un error asi que buscando por otros foros encontre una solucion. Lo que yo tenia antes era lo siguiente en el codigo donde se encuentra mi ajax

miUrlContodoyParametros="http://miSitio?parameter1=hola&parameter2=mundo"

ajax.open("POST", miUrlContodoyParametros, true);
ajax.send(miUrlContodoyParametros);



Buscando por alli encontre que para que fuera posible enviar mucha informacion debia agregar la siguiente linea depues de ajax.open

http.setRequestHeader('content-type', 'application/x-www-form-urlencoded');

y separar la direccion de mi servidor y los parametros que enviaba es decir asi:

miUrl="http://miSitio" //aqui es solo la direccion del sitio
misparametros="parameter1=hola&parameter2=mundo" //y aqui van todos los parametros sin importar el tamaño de informacion

ajax.open("POST", miUrl, true);
ajax.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
ajax.send(misparametros);


con esto solucione el problema del tamaño de informacion pero despues resulto que los ACENTOS o Ñ ñ eran otro problema asi que buscando encontre que solo tenia que agregar dentro de mi funcion ajax.setRequestHeader lo siguiente charset=UTF-8

y la linea del setRequestHeader quedo de la siguiente manera:

ajax.setRequestHeader('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');


asi que el codigo quedo asi:



miUrl="http://miSitio" //aqui es solo la direccion del sitio
misparametros="parameter1=hola&parameter2=mundo" //y aqui van todos los parametros sin importar el tamaño de informacion


ajax.open("POST", miUrl, true);
ajax.setRequestHeader('content-type', 'application/x-www-form-urlencoded;charset=UTF-8'');
ajax.send(misparametros);


espero les haya podido ayudar.

Última edición por robertz00rc; 23/10/2008 a las 13:13 Razón: mejora
  #15 (permalink)  
Antiguo 23/10/2008, 16:03
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Solucion definitiva sobre ACENTOS

Gracias por tu aporte, trata de no revivir temas viejos (2007).

Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 11:18.