2009-06-08 21 views
9

Non riesco a capire perché non riesco a ottenere un charstet ISO-8859-1 corretto dalla risposta del server. Essendo questo un lavoro sul codice legacy, difficilmente potrei cambiare la codifica del charset sulle pagine.Jquery: post e codifica ajax

Faccio uso di JQuery chiamare

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

la pubblicazione di un valore di textarea creata 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> 

Lo script lato server che elabora la richiesta dichiara al suo superiore:

text/html; charset=ISO-8859-1 

quindi, onestamente, non riesco a capire cos'altro dovrei dichiarare, in termini di codifica. Ciò nonostante, i caratteri accentati "àèéìòù" rimbalzano come: "ùÜòù" quando si posiziona la risposta del server in un elemento HTML

La sorgente viene salvata come ascii. Tryng di fare questo per avere la codifica Html rudimentale sulla variabile per essere pubblicato non risolve:

ctext = escapeHTML(ctext); 

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

Qualche idea?

Grazie!

+0

Beh ... questo è pazzesco. Non posso crederci. Il problema è risolto dichiarando UTF-8 la pagina lato server che restituisce la risposta a una richiesta jax. Voglio dire: dichiarando un set di caratteri che è DIFFERENTE forma il set di caratteri appropriato usato nella pagina che fa la richiesta di ajax. – Daniel

risposta

5

Ho una soluzione migliore adesso. Entrambe pubblicano e ottengono lavori PERFETTAMENTE. Sto lavorando su tomcat che per impostazione predefinita gestisce la roba ISO 8859.

proprietà della pagina Web:

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

charset della pagina web all'interno della testa.

Ora, tutti i miei parametri sono sfuggiti con la funzione di escape, ho fornito questa soluzione prima.

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

Ora, quando si invia la richiesta ajax ho impostato il contentType a questo:

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

E, infine, quando si riceve i parametri al servlet o qualsiasi ricevitore ottengo un parametro decodificato usando questo.

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 e GET funziona perfettamente in IE 7 e 8, Safari, Chrome e Firefox.

+0

con queste soluzioni ho problemi quando qualcuno invia il carattere '%'. URLDecoder.decode lancia un'eccezione (argomento Ilegal - pattern incompleto di escape (%)). –

0

Per quanto ne so jQuery utilizza la codifica della pagina Web che richiama il metodo AJAX per interpretare i dati ricevuti. Stai usando la codifica corretta per la pagina? Se sì, allora molto probabilmente l'errore si trova con il codice del server. Prova a chiamare il gestore AJAX a livello di codice (all'esterno del browser Web) per vedere cosa sta restituendo.

+0

Sto usando: Daniel

1

Non è sicuro se si tratti di ciò che sta rompendo la situazione, ma accept-charset è estremamente mal supportato, e si potrebbe anche non usarlo. È la codifica della pagina che controllerà ciò che viene inviato al server.

Sarebbe utile se si guardassero i file salvati sul proprio server per vedere se i dati in essi contenuti sono buoni o meno. Questo avrebbe almeno stabilito se la parte client-> server della transazione funzionasse.

0

Tutte le mie pagine sono ISO-8859-1, la mia risposta è anche 8859 ma jquery ajax mi stava facendo impazzire. La mia soluzione è stata la funzionalità originale $ .ajax con questa. Funziona perfettamente per la richiesta GET e pubblicherò presto la soluzione per la richiesta POST.

La chiamata:

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

la fonte per la funzione di fuga

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

la fonte per la funzione 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

Si prega di provare a utilizzare escape() in javascript e urldecode() nel file php

che funzionerà.

2

ho usato il seguente in javascript

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

e la successiva in PHP

urldecode($var) 

Ha funzionato per me.

0

Forse hai dimenticato di dichiarare contentType sul server prima di specificarlo come UTF-8, in questo caso, contentType è nullo e il server non sa che tipo di dati sta trattando. Dopo aver dichiarato contentType come UTF-8, il server è in grado di capire con che tipo di dati sta lavorando. Dichiarare contentType come UTF-8 non è la soluzione corretta, anche se aiuta. La risposta fornita da Rodrigo probabilmente sarebbe la migliore soluzione per il tuo problema.