2012-09-17 2 views
11

Recentemente mi sono imbattuto in un comportamento molto strano relativo alla codifica dei caratteri per le chiamate AJAX effettuate utilizzando il metodo POST. Per farla breve, ho un modulo HTML con campi di testo che possono accettare segni diacritici (ad esempio "" "). Quando il modulo viene inviato, i dati del modulo vengono racchiusi in un blocco XML e inviati a un server, che archivia tali informazioni in un database MySQL. Successivamente, tali informazioni vengono recuperate dal database e visualizzate agli utenti regolari, così come sono.Problema con codifica caratteri nelle richieste POST inviate con Firefox

Se la richiesta viene inviata da Chrome o IE, tutto va bene. Ciò significa che i dati, compresi i segni diacritici, vengono inviati, archiviati, quindi recuperati e visualizzati correttamente. Tuttavia, quando utilizzo Firefox per questo, XML sembra inviare i dati del modulo a destra, ma quando ricarico la pagina Web, i segni diacritici inviati in precedenza non vengono visualizzati. In altre parole, sembrano perdersi da qualche parte lungo la strada. Ad esempio, se l'XML contiene la parola "tästä", quando carico la pagina, vedo "tst".

Perché sta succedendo? Firefox codifica i messaggi in modo diverso da IE e Chrome?

In caso aiuta, ho allegato la richiesta e la risposta intestazioni da Chrome e Firefox, esattamente per lo stesso contenuto del modulo - solo un esempio:

A proposito, io non sono la codifica dei dati prima di inviarlo al server, semplicemente recuperando il valore dei campi del modulo, così com'è.

CROMO:

Il blocco di dati XML:

<request> 
<session>{hidden by me}</session> 
<builder>Hem i Stan tästä</builder> 
</request> 

Le intestazioni di richiesta:

Accept:*/* 
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8 
Connection:keep-alive 
Content-Length:562 
Content-Type:application/x-www-form-urlencoded 
Cookie:PHPSESSID=rlne2d787j0np52ec5rtn04dm1 
Host:83.150.87.220 
Origin:http://hidden.by.me 
Referer:http://http://hidden.by.me/?c=2094211 
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1 
X-Requested-With:XMLHttpRequest 

intestazioni di risposta:

Connection:Keep-Alive 
Content-Encoding:gzip 
Content-Type:application/xml 
Date:Mon, 17 Sep 2012 16:21:58 GMT 
Keep-Alive:timeout=5, max=100 
Server:Apache/2.2.11 (Win32) PHP/5.2.9-1 
Transfer-Encoding:chunked 
Vary:Accept-Encoding 

FIREFOX:

Il blocco di dati XML:

<request> 
<session>{hidden by me}</session> 
<builder>Hem i Stan tästä</builder> 
</request> 

Le intestazioni di richiesta:

Accept */* 
Accept-Encoding gzip, deflate 
Accept-Language en-us,en;q=0.5 
Connection keep-alive 
Content-Length 562 
Content-Type application/x-www-form-urlencoded; charset=UTF-8 
Cookie PHPSESSID=kvfg4fp2trorllim19dmn241c7 
Host hidden.by.me 
Referer http://hidden.by.me/?c=2094211 
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1 
X-Requested-With XMLHttpRequest 

intestazioni di risposta:

Connection Keep-Alive 
Content-Encoding gzip 
Content-Type application/xml 
Date Mon, 17 Sep 2012 16:21:23 GMT 
Keep-Alive timeout=5, max=100 
Server Apache/2.2.11 (Win32) PHP/5.2.9-1 
Transfer-Encoding chunked 
Vary Accept-Encoding 
+1

Si noti che le intestazioni "Content-type" sono diverse: Firefox invia UTF-8 al server. – Pointy

+0

Ma in entrambi i casi, la codifica dei caratteri è UTF-8. Non è solo una questione di layout delle informazioni in Firebug rispetto a Chrome Inspector? –

+0

Intendevo il 'Content-Type' nell'intestazione * request *. In Firefox, in base a ciò che hai pubblicato, è "application/x-www-form-urlencoded; charset = UTF-8", ma quella clausola "charset" manca nelle informazioni di Chrome. Non so dire se sia stato pubblicato su UTF-8; il tuo server dovrebbe essere in grado di dirlo. Il problema deve essere qualcosa del genere, in ogni caso. – Pointy

risposta

5

Come @Pointy menzionato qualche tempo fa, il problema era relativo alla richiesta Content-Type della POST, perché Firefox sembra codificare i messaggi POST in modo diverso rispetto ad altri browser. Nella mia testa, Data-Type e Content-Type erano gli stessi e così, non mi sono reso conto che è necessario specificare UTF-8 come lo standard di codifica dei caratteri in entrambi i casi. Ma una volta modificato sia lo Content-Type sia lo Data-Type con un chiaro "text/xml; charset = UTF-8", il problema è stato risolto.

1

Sono veramente felice. Grazie ragazzi per aver postato e capito prima. Mi ci sono volute un paio d'ore per avvicinarmi abbastanza al problema per trovare questo attraverso googling, ma a causa dei tuoi commenti, ho risolto questo problema in meno di un giorno; e in tempo per la grande presentazione di domani! :)

E 'stato così strano, visto che tutti i browser mandavano la stessa stringa di dati in una richiesta di AJAX, ma ottenendo risultati diversi, a seconda del browser (Firefox essere diversi.)

ho provato questo, ma non ha funzionato:

req.setRequestHeader ("codifica", "utf-8");

Quindi ho appena fatto ciò che hai detto che Firefox fa e una soluzione di codifica funziona in tutti i browser.

req.setRequestHeader ("Tipo di contenuto", "application/x-www-form-urlencoded; charset = utf-8");

Ho provato su Chrome, MSIE, Firefox, Safari, Opera e Opera Avanti. Funziona ogni volta!