Recientemente me encontré con un comportamiento muy extraño relacionado con la codificación de caracteres para llamadas AJAX realizadas mediante el método POST. Para resumir, tengo un formulario HTML con campos de texto que pueden aceptar signos diacríticos (por ejemplo, "ä"). Cuando se envía el formulario, los datos del formulario se envuelven en un bloque XML y se envían a un servidor, que almacena esa información en una base de datos MySQL. Posteriormente, esa información se recupera de la base de datos y se muestra a los usuarios habituales, tal como está.Problema con la codificación de caracteres en las solicitudes POST enviadas con Firefox
Si la solicitud se envía desde Chrome o IE, todo está bien. Esto significa que los datos, incluidos los signos diacríticos, se envían, almacenan, luego se recuperan y se muestran correctamente. Sin embargo, cuando uso Firefox para esto, el XML parece enviar los datos del formulario a la derecha, pero cuando vuelvo a cargar la página web, los signos diacríticos enviados anteriormente no aparecen. En otras palabras, parecen perderse en algún lugar en el camino. Por ejemplo, si el XML contiene la palabra "tästä", cuando cargo la página veo "tst".
¿Por qué sucede esto? ¿Firefox está codificando los mensajes de la publicación de forma diferente a IE y Chrome?
En caso de que ayuda, he adjuntado las cabeceras de petición y respuesta de Chrome y Firefox, por exactamente el mismo contenido de forma - sólo un ejemplo:
Por cierto, no estoy codificar los datos antes de enviarlo al servidor, simplemente recuperando el valor de los campos del formulario, tal como está.
Chrome:
El bloque de datos XML:
<request>
<session>{hidden by me}</session>
<builder>Hem i Stan tästä</builder>
</request>
Los encabezados de la solicitud:
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
Las cabeceras de respuesta:
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:
El bloque de datos XML:
<request>
<session>{hidden by me}</session>
<builder>Hem i Stan tästä</builder>
</request>
Los encabezados de la solicitud:
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
Las cabeceras de respuesta:
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
Observe que los encabezados 'Content-type' son diferentes: Firefox está enviando UTF-8 a su servidor. – Pointy
Pero en ambos casos, la codificación de caracteres es UTF-8. ¿No es solo un problema de diseño de información en Firebug en comparación con el Inspector de Chrome? –
Quise decir 'Content-Type' en el encabezado * request *. En Firefox, según lo que publicaste, es "application/x-www-form-urlencoded; charset = UTF-8", pero esa cláusula "charset" falta en la información de Chrome. Ya sea que se publique realmente en UTF-8, no puedo decirlo; su servidor debería ser capaz de decir. El problema tiene que ser algo así, en cualquier caso. – Pointy