Foros del Web » Programando para Internet » ASP Clásico »

Asp + ajax + utf8

Estas en el tema de Asp + ajax + utf8 en el foro de ASP Clásico en Foros del Web. Buenos días. Tengo un problema y llevo 2 horas mirando por todas partes. El escenario del crimen es un formulario donde se introducen unos datos ...
  #1 (permalink)  
Antiguo 25/09/2008, 02:28
Avatar de mgusdl  
Fecha de Ingreso: abril-2007
Ubicación: Malaga, España
Mensajes: 190
Antigüedad: 17 años, 1 mes
Puntos: 5
Pregunta Asp + ajax + utf8

Buenos días.

Tengo un problema y llevo 2 horas mirando por todas partes.

El escenario del crimen es un formulario donde se introducen unos datos y se envían, previa validación, mediante post de manera asíncrona de esta manera:
Código PHP:
var frm document.forms.miFormulario;
var 
qString "a=1";
for (
i=0i<frm.elements.lengthi++)
    {
    
qString += "&"frm.elements[i].name "=" frm.elements[i].value;
    }
var 
xo xmlobj();
xo.open('POST''xml_recibe.asp?d1=' d1 '&d2=' d2 '&d3=' d3);
xo.setRequestHeader("Content-Type""application/x-www-form-urlencoded");
xo.onreadystatechange = function()
    {
    if (
xo.readyState == 4)
        {
        
alert(xo.responseText);
        if (
xo.responseText.substring(05) != 'Error'frm.reset();
        
cargaAluP(exafgr);
        }
    }
xo.send(qString); 
La funcion xmlobj() está más que probada y lo único que hace es crear el objeto ajax.

Estos datos se reciben en el citado archivo, se procesan y se insertan en una BD MSSQL.

La solución empezó por comenzar el archivo con:
Código PHP:
<%@ Language=VBScript Codepage=65001 %> 
También he probado, con peores resultados, una función similar a utf8_decode de PHP que me he encontrado.

Después de solucionar las tildes, ñ y resto de caracteres aún me queda que se pierden los espacios en la conversión
Es decir, si envío la cadena "PEPE GONZALEZ", en la BD acaba guardado "PEPEGONZALEZ"

También he probado cambiar la codificación de los archivos implicados de ANSI a UTF8, sin ningún cambio ni a mejor ni a peor.

De momento estoy pensando aplicar un parche, sustituyendo " " por los caracteres ";:" y restaurando luego en destino, pero me gustaría saber si alguien tiene una solución más... bonita.
  #2 (permalink)  
Antiguo 25/09/2008, 03:45
Avatar de PosProdukcion  
Fecha de Ingreso: noviembre-2004
Ubicación: Manzanares el Real (Madrid)
Mensajes: 726
Antigüedad: 19 años, 6 meses
Puntos: 9
Respuesta: Asp + ajax + utf8

Por probar, prueba también esta: <%@ Language=VBScript Codepage=1252 %> , a mi me solucipnó el mismo problema (sin Ajax, solo ASP).

¿En la BD los campos son varchar() o nvarchar()? S son UTF-8 deberían ser nvarchar(), que es unicode.

Y si tienes un servidor o hosting, prueba también en el servidor, a mi este tipo de problemas me ocurren solo en local, no en remoto (ya te digo, que yo lo solucioné con el Codepage=1252.

Si no... siempre puedes ir a la solución drástica:

Código asp:
Ver original
  1. Function quitaTildes(texto)
  2.         If not EsNulo(texto) Then
  3.             texto = Replace(texto, "¡", "", 1, Len(texto), 1)
  4.             texto = Replace(texto, "¿", "", 1, Len(texto), 1)
  5.             texto = Replace(texto, "'", "", 1, Len(texto), 1)
  6.  
  7.             Texto = Replace(Texto, "á", "a", 1, Len(Texto), 1)
  8.             Texto = Replace(Texto, "é", "e", 1, Len(Texto), 1)
  9.             Texto = Replace(Texto, "í", "i", 1, Len(Texto), 1)
  10.             Texto = Replace(Texto, "ó", "o", 1, Len(Texto), 1)
  11.             Texto = Replace(Texto, "ú", "u", 1, Len(Texto), 1)
  12.             Texto = Replace(Texto, "ñ", "n", 1, Len(Texto), 1)
  13.             texto = Replace(texto, "ç", "c", 1, Len(texto), 1)
  14.  
  15.             texto = Replace(texto, "Á", "A", 1, Len(texto), 1)
  16.             texto = Replace(texto, "É", "E", 1, Len(texto), 1)
  17.             texto = Replace(texto, "Í", "I", 1, Len(texto), 1)
  18.             texto = Replace(texto, "Ó", "O", 1, Len(texto), 1)
  19.             texto = Replace(texto, "Ú", "U", 1, Len(texto), 1)
  20.             texto = Replace(texto, "Ñ", "N", 1, Len(texto), 1)
  21.             texto = Replace(texto, "Ç", "C", 1, Len(texto), 1)
  22.  
  23.             texto = Replace(texto, "à", "a", 1, Len(Texto), 1)
  24.             texto = Replace(texto, "è", "e", 1, Len(Texto), 1)
  25.             texto = Replace(texto, "ì", "i", 1, Len(Texto), 1)
  26.             texto = Replace(texto, "ò", "o", 1, Len(Texto), 1)
  27.             texto = Replace(texto, "ù", "u", 1, Len(Texto), 1)
  28.                                        
  29.             texto = Replace(texto, "À",  "A", 1, Len(texto), 1)
  30.             texto = Replace(texto, "È",  "E", 1, Len(texto), 1)
  31.             texto = Replace(texto, "Ì",  "I", 1, Len(texto), 1)
  32.             texto = Replace(texto, "Ò",  "O", 1, Len(texto), 1)
  33.             texto = Replace(texto, "Ù",  "U", 1, Len(texto), 1)
  34.  
  35.             texto = Replace(texto, "ä", "a", 1, Len(Texto), 1)
  36.             texto = Replace(texto, "ë", "e", 1, Len(Texto), 1)
  37.             texto = Replace(texto, "ï", "i", 1, Len(Texto), 1)
  38.             texto = Replace(texto, "ö", "o", 1, Len(Texto), 1)
  39.             texto = Replace(texto, "ü", "u", 1, Len(Texto), 1)
  40.  
  41.             texto = Replace(texto, "Ä",  "A", 1, Len(texto), 1)
  42.             texto = Replace(texto, "Ë",  "E", 1, Len(texto), 1)
  43.             texto = Replace(texto, "Ï",  "I", 1, Len(texto), 1)
  44.             texto = Replace(texto, "Ö",  "O", 1, Len(texto), 1)
  45.             texto = Replace(texto, "Ü",  "U", 1, Len(texto), 1)
  46.  
  47.             texto = Replace(texto, "â", "a", 1, Len(Texto), 1)
  48.             texto = Replace(texto, "ê", "e", 1, Len(Texto), 1)
  49.             texto = Replace(texto, "î", "i", 1, Len(Texto), 1)
  50.             texto = Replace(texto, "ô", "o", 1, Len(Texto), 1)
  51.             texto = Replace(texto, "û", "u", 1, Len(Texto), 1)
  52.  
  53.             texto = Replace(texto, "Â",  "A", 1, Len(texto), 1)
  54.             texto = Replace(texto, "Ê",  "E", 1, Len(texto), 1)
  55.             texto = Replace(texto, "Î",  "I", 1, Len(texto), 1)
  56.             texto = Replace(texto, "Ô",  "O", 1, Len(texto), 1)
  57.             texto = Replace(texto, "Û",  "U", 1, Len(texto), 1)
  58.        Else
  59.             texto = ""
  60.         End If
  61.         quitaTildes = texto
  62.     End Function
  #3 (permalink)  
Antiguo 25/09/2008, 04:59
Avatar de mgusdl  
Fecha de Ingreso: abril-2007
Ubicación: Malaga, España
Mensajes: 190
Antigüedad: 17 años, 1 mes
Puntos: 5
Respuesta: Asp + ajax + utf8

Bueno, lo de poner el servidor en UTF8 no es posible y además corro el riesgo de perder información de muuuuuuuchos alumnos de los ultimos 5 años. Ya lo investigué en su día para otras cosas.

Cambiar a la pagina de codigos 1252 no cambia el hecho de que la información llega en UTF8 si o si, tendria que seguir traduciendo los caracteres, al menos al estar el script con la misma codificacion se entienden.

La solucion del replace es matar moscas a cañonazos, eso lo dejo para los simplistas.

De momento funciona lo que comenté inicialmente, aunque sea un parche es bastante menos código y más eficiente. En vez de usar el método replace nativo de js, he pillado de por ahi una función:

Código PHP:
function replace(textos1s2) { return texto.split(s1).join(s2); } 
Y en la función inicial:
Código PHP:
for (i=0i<frm.elements.lengthi++)
    {
    
qString += "&"frm.elements[i].name "=" replace(frm.elements[i].value' '';:');
    } 
Luego en ASP, como ya tengo una funcion para limpiar las cadenas y prevenir SQLInjection, simplemente he agregado
Código PHP:
cadena Replace(cadena";:"" "
  #4 (permalink)  
Antiguo 25/09/2008, 06:02
Avatar de PosProdukcion  
Fecha de Ingreso: noviembre-2004
Ubicación: Manzanares el Real (Madrid)
Mensajes: 726
Antigüedad: 19 años, 6 meses
Puntos: 9
Respuesta: Asp + ajax + utf8

Cita:
Iniciado por mgusdl Ver Mensaje
Cambiar a la pagina de codigos 1252 no cambia el hecho de que la información llega en UTF8 si o si, tendria que seguir traduciendo los caracteres, al menos al estar el script con la misma codificacion se entienden.
Esto (<%@ Language=VBScript Codepage=1252 %>) te lo comentaba porque a mí me funciona en páginas que están en UTF-8, no me preguntes por qué, pero ma fallaba con 65001.

Acerca de esta llamada en el Ajax:

Código:
xo.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
No indicas el charset del objeto, ¿has probado a poner alguno? ¿Que charset tiene la página llamante?

¿Has probado a hacer la llamada a pelo, sin Ajax, a ver si también ocurre el problema? Si no ocurre está claro que el problema no es del ASP llamado, sino de la llamada en sí
  #5 (permalink)  
Antiguo 25/09/2008, 08:39
Avatar de mgusdl  
Fecha de Ingreso: abril-2007
Ubicación: Malaga, España
Mensajes: 190
Antigüedad: 17 años, 1 mes
Puntos: 5
De acuerdo Respuesta: Asp + ajax + utf8

Buenas PosProdukcion

He probado lo del charset 1252, además en JS he especificado en la cabecera que sea iso-8859-1, que es el que usa el servidor por defecto y el que se especifica en las cabeceras HTML de la página.

Yo normalmente trabajo con PHP (esto es una parte antigua que aun está en ASP y he de mantener hasta que la jubile) y toda la información en texto que recibo mediante este método la paso por utf8_decode y no tengo más problemas.

Creo que se va ha quedar con lo de la sustitución de los espacios, que funciona OK.

Muchas gracias por las posibilidades aportadas.
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.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:22.