2009-06-08 29 views
9

No puedo entender por qué no puedo obtener un charstet ISO-8859-1 correcto de la respuesta del servidor. Siendo esto un trabajo en código heredado, difícilmente podría cambiar la codificación de charset en las páginas.Jquery: publicación ajax y codificación

hago uso de la jQuery llamar

$.post("server-side-code", {t:ctext, i:ioff, sid:sessionid}, 
    function(data, status) {    
     $('#chk').append(data); 
    }); 

publicar un valor área de texto creado usando javascript:

<form accept-charset='ISO-8859-1' method='post'> 
<textarea cols='40' rows='8' id='commento'></textarea><br> 
<input type='button' value='invia' id='submit'></form> 

El script del lado del servidor procesar la solicitud declara en su parte más alta:

text/html; charset=ISO-8859-1 

así que, honestamente, no puedo entender qué más debo declarar, en términos de codificación A pesar de esto, los caracteres acentuados "àèéìòù" se recuperan como: "à èà © òù" al colocar la respuesta del servidor en un elemento HTML

La fuente se guarda como ascii. Tryng hacer esto para tener rudimentaria codificación HTML en la variable a ser publicado no resuelve:

ctext = escapeHTML(ctext); 

function escapeHTML (str) 
{ 
    var div = document.createElement('div'); 
    var text = document.createTextNode(str); 
    div.appendChild(text); 
    return div.innerHTML; 
}; 

Alguna idea?

Gracias!

+0

Bueno ... esto es una locura. No puedo creerlo. El problema se resuelve declarando que UTF-8 es la página del servidor que devuelve la respuesta a la solicitud ajax. Quiero decir: declarar un conjunto de caracteres que es DIFERENTE forma el juego de caracteres adecuado utilizado en la página que realiza la solicitud de Ajax. – Daniel

Respuesta

5

tengo una solución mejor ahora. Ambos publican y funcionan PERFECTAMENTE. Estoy trabajando en tomcat que por defecto maneja cosas de ISO 8859.

propiedades de la página Web:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 

juego de caracteres de la página web dentro de la cabeza.

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

Ahora, todos los parámetros se han escapado con la función de escape, proporcioné esta solución antes.

(function($) {$.fn.escape = function() { 
    return escape(this.val());};})(jQuery); 

Ahora, al enviar la solicitud ajax que establezca el contentType a esto:

contentType : "application/x-www-form-urlencoded; charset=iso-8859-1" 

Y, por último, al recibir los parámetros en el servlet o cualquier receptor puedo obtener un parámetro decodificado usando esto.

public String getHttpParameter(String name) throws Exception { 
    String value = this.getHttpRequest().getParameter(name); 
    return value == null || value.isEmpty() ? value : URLDecoder.decode(value,"ISO-8859-1"); 
} 

POST y GET funciona perfectamente en IE 7 y 8, Safari, Chrome y Firefox.

+0

con estas soluciones Tengo problemas cuando alguien envía el caracter '%'. URLDecoder.decode lanza una excepción (argumento Ilegal - Incomplete trailing escape pattern (%)). –

0

Por lo que sé, jQuery utiliza la codificación de la página web que invoca el método AJAX para interpretar los datos recibidos. ¿Estás usando la codificación correcta para la página? Si es así, entonces lo más probable es que el error recaiga en el código del servidor. Intente llamar al controlador AJAX programáticamente (fuera del navegador web) para ver qué devuelve.

+0

Estoy usando: Daniel

1

No estoy seguro si es lo que está rompiendo su situación, pero accept-charset es extremadamente poco compatible, y ni siquiera puede usarlo. Es la codificación de la página que controlará lo que se envía de vuelta al servidor.

Sería útil si mirara los archivos guardados en su servidor para ver si los datos en ellos son buenos o no. Eso al menos establecería si la parte cliente-> servidor de la transacción está funcionando.

0

Todas mis páginas son ISO-8859-1, mi respuesta es también 8859 pero jquery ajax me estaba volviendo loco. Mi solución fue envolver la funcionalidad $ .ajax original con esto. Funciona perfectamente para la solicitud GET, y pronto publicaré la solución para la solicitud POST.

La llamada:

$.myrequest({ 
    url: "/myapp/myurl", 
    params: { 
    key1: $("#myinput").escape() 
    } 
}); 

la fuente para la función de escape

(function($) { 
$.fn.escape = function() { 
    return escape(this.val()); 
};})(jQuery); 

la fuente para la función myRequest

(function($) { 

$.request = function(settings) { 

    /** 
    * generates a string that will be passed as 
    * data instead an object, but we have the capability 
    * of pass an object but in another variable called param 
    */ 
    function _parseParameters(settings) { 
     var data = ""; 
     for (var param in settings.params) { 
      data += param + "=" + settings.params[param] + "&"; 
     } 
     settings.data = data; 
    } 
    _parseParameters(settings); 
    $.ajax(settings); 
}})(jQuery); 
1

Por favor, intente utilizar de escape() en JavaScript y urldecode() en el archivo PHP

que va a funcionar.

2

he utilizado el siguiente en javascript

escape($("#some_id").val()) 

y la siguiente en PHP

urldecode($var) 

Se trabajó para mí.

0

Quizás se haya olvidado de declarar el contentType en el servidor antes para especificarlo como UTF-8, en este caso, contentType es nulo y el servidor no sabe con qué tipo de datos está tratando. Una vez que declara el contentType como UTF-8, el servidor puede entender con qué tipo de datos está trabajando. Declarar el contentType como UTF-8 no es la solución correcta, aunque ayuda. La respuesta proporcionada por Rodrigo probablemente sería la mejor solución para su problema.

Cuestiones relacionadas