Ver Mensaje Individual
  #1 (permalink)  
Antiguo 06/09/2011, 05:47
Pikus
 
Fecha de Ingreso: febrero-2010
Mensajes: 22
Antigüedad: 14 años, 9 meses
Puntos: 0
Problemas de especificación de charset

Buenas a tod@s,

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
  1. <%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
  2. <% Option Explicit %>
  3. <?xml version="1.0" encoding="ISO-8859-1"?>
  4. <% ' Especificamos envío de conjunto de caracteres
  5. Response.Charset = "iso-8859-1"
  6.  
  7. If Request.QueryString("prov") = 99 Or Request.QueryString("prov") = "" Then
  8.     %>
  9.     <input class="singlefield" type="text" name="cp" id="cp" value="" />
  10.     <%
  11.     Response.End
  12. End If
  13.  
  14. If Request.QueryString("loc") = "" Then
  15.     %>
  16.     <input class="singlefield" type="text" name="cp" id="cp" value="" />
  17.     <%
  18.     Response.End
  19. End If
  20.  
  21. Dim SQL, conexion, rsLocalidades, ArrayRecordSet, i, SizeArray
  22.  
  23. ' Conecto y muestro error en caso de no lograr conectar
  24.  
  25. On Error Resume Next
  26.  
  27. 'Abro conexión a BD interna y transacción
  28. Set conexion = CreateObject("ADODB.Connection")
  29.     conexion.ConnectionString="DSN=BD Interna"
  30.     conexion.Open
  31.     conexion.BeginTrans
  32.  
  33. 'Si no logro conectar, reseteo el número de error y conecto a servidor externo
  34. If Err.Number <> 0 Then
  35.  
  36.     On Error GoTo 0
  37.     On Error Resume Next
  38.    
  39.     conexion.ConnectionString="DSN=MeetingPoint"
  40.     conexion.Open
  41.     conexion.BeginTrans
  42.  
  43.     'No se logró conectar a ninguno de los dos, muestro error
  44.     If Err.Number <> 0 Then
  45.         Response.Write("Error, elija de nuevo.")
  46.         Response.End
  47.     End If
  48. End If
  49.  
  50. ' Lanzamos el RecordSet en modo 0, 1, 0 con cursor en local para tratar de reducir su tiempo de ejecución
  51. Set rsLocalidades = Server.CreateObject("ADODB.Recordset")
  52.     rsLocalidades.CursorLocation = 3    'adUseClient
  53.     rsLocalidades.CursorType = 0        'adOpenForwardOnly
  54.     rsLocalidades.LockType = 1          'adLockReadOnly
  55.     SQL = "SELECT DISTINCT(codpostal) FROM codpostloc WHERE provincia = '" & Request.QueryString("prov") & "' AND " & _
  56.           "poblacion = '" & Request.QueryString("loc") & "' ORDER BY 1"
  57.     rsLocalidades.Open SQL, conexion
  58.    
  59.     ' Response.Write(SQL)
  60.        
  61. If Err.Number <> 0 Then
  62.     Response.Write("Error, seleccione localidad de nuevo.")
  63.     conexion.RollbackTrans
  64.     Response.End
  65. End If
  66.  
  67. ' Copio a un array el RecordSet, calculo tamaño máximo de la dimensión 2 (1-columna/2-fila) y cierro conexión
  68. ArrayRecordSet = rsLocalidades.GetRows
  69. SizeArray = UBound(ArrayRecordSet, 2)
  70. ' Response.Write("<br>" & ArrayRecordSet(0,0))
  71. rsLocalidades.Close
  72. conexion.RollbackTrans
  73. conexion.Close
  74.  
  75. On Error Goto 0 %>
  76.  
  77. <% If SizeArray > 0 Or IsArray(ArrayRecordSet) Then %>
  78. <select class="singlefieldcombo" id="cp" name="cp" >
  79.     <% If SizeArray > 0 Then %>
  80. <option value=""></option>
  81.     <% End If %>
  82.     <% For i = 0 To SizeArray %>
  83. <option value="<%=ArrayRecordSet(0, i)%>"><%=ArrayRecordSet(0, i)%></option>
  84.     <%Next %>
  85. </select>
  86. <% End If %>

Muchas gracias y un saludo.