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
Si noti che le intestazioni "Content-type" sono diverse: Firefox invia UTF-8 al server. – Pointy
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? –
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