Llevo durante unas horas peleándome con un tema. La situación es la siguiente:
Tengo 3 páginas, una principal y 2 cargas por ajax, todas ellas en ASP clásico. Las cargas ajax son para rellenar varios select (el típico de Provincia/Localidad/Código Postal), el problema me surge durante la comunicación con ellas...
Todas mis páginas están perfectamente advertidas que son ISO-8859-1 (también conocido como Windows 1252) con códigos como estos:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
Response.Charset = "iso-8859-1"
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
Y en las respuestas aunque son HTML coloqué esto:
<?xml version="1.0" encoding="ISO-8859-1"?>
He probado también esto:
ajax.setRequestHeader("Accept-Charset", "ISO-8859-1");
ajax.setRequestHeader("Content-Type", "text/xml; charset=iso-8859-1");
ajax.send(null);
El problema está en que cuando solicito las provincias y las localidades no tengo ningún problema, veo las tildes y las "ñ", pero cuando envío la variable del nombre de la localidad para sacar sus códigos postales no me devuelve nada en las SELECT que incluyen tilde o Ñ en todos los navegadores salvo Internet Explorer 8 (que mágicamente en él no tengo problema y sí se realiza toda la comunicación en iso-8859-1). He podido comprobar que es porque al enviarlas, Ajax me lo envía en UTF-8 al servidor web y no conozco ninguna forma de cambiar esto o de transformar algo en UTF-8 a Windows 1252 desde ASP.
Mi base de datos está codificada en ISO-8859-1 y desconozco si es capaz de devolverme los datos en UTF-8 ya que lo intenté pero me daba error (es ASA).
Pongo el código en cualquier caso por si fuese necesario:
Código ASP:
Ver original
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%> <% Option Explicit %> <?xml version="1.0" encoding="ISO-8859-1"?> <% ' Especificamos envío de conjunto de caracteres Response.Charset = "iso-8859-1" If Request.QueryString("prov") = 99 Or Request.QueryString("prov") = "" Then %> <input class="singlefield" type="text" name="cp" id="cp" value="" /> <% Response.End End If If Request.QueryString("loc") = "" Then %> <input class="singlefield" type="text" name="cp" id="cp" value="" /> <% Response.End End If Dim SQL, conexion, rsLocalidades, ArrayRecordSet, i, SizeArray ' Conecto y muestro error en caso de no lograr conectar On Error Resume Next 'Abro conexión a BD interna y transacción Set conexion = CreateObject("ADODB.Connection") conexion.ConnectionString="DSN=BD Interna" conexion.Open conexion.BeginTrans 'Si no logro conectar, reseteo el número de error y conecto a servidor externo If Err.Number <> 0 Then On Error GoTo 0 On Error Resume Next conexion.ConnectionString="DSN=MeetingPoint" conexion.Open conexion.BeginTrans 'No se logró conectar a ninguno de los dos, muestro error If Err.Number <> 0 Then Response.Write("Error, elija de nuevo.") Response.End End If End If ' Lanzamos el RecordSet en modo 0, 1, 0 con cursor en local para tratar de reducir su tiempo de ejecución Set rsLocalidades = Server.CreateObject("ADODB.Recordset") rsLocalidades.CursorLocation = 3 'adUseClient rsLocalidades.CursorType = 0 'adOpenForwardOnly rsLocalidades.LockType = 1 'adLockReadOnly SQL = "SELECT DISTINCT(codpostal) FROM codpostloc WHERE provincia = '" & Request.QueryString("prov") & "' AND " & _ "poblacion = '" & Request.QueryString("loc") & "' ORDER BY 1" rsLocalidades.Open SQL, conexion ' Response.Write(SQL) If Err.Number <> 0 Then Response.Write("Error, seleccione localidad de nuevo.") conexion.RollbackTrans Response.End End If ' Copio a un array el RecordSet, calculo tamaño máximo de la dimensión 2 (1-columna/2-fila) y cierro conexión ArrayRecordSet = rsLocalidades.GetRows SizeArray = UBound(ArrayRecordSet, 2) ' Response.Write("<br>" & ArrayRecordSet(0,0)) rsLocalidades.Close conexion.RollbackTrans conexion.Close On Error Goto 0 %> <% If SizeArray > 0 Or IsArray(ArrayRecordSet) Then %> <select class="singlefieldcombo" id="cp" name="cp" > <% If SizeArray > 0 Then %> <option value=""></option> <% End If %> <% For i = 0 To SizeArray %> <option value="<%=ArrayRecordSet(0, i)%>"><%=ArrayRecordSet(0, i)%></option> <%Next %> </select> <% End If %>
Muchas gracias y un saludo.