2012-09-17 11 views
11

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 
+1

Observe que los encabezados 'Content-type' son diferentes: Firefox está enviando UTF-8 a su servidor. – Pointy

+0

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? –

+0

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

Respuesta

5

Como @Pointy mencionó hace algún tiempo, el problema estaba relacionado con el Content-Type de la solicitud POST, porque Firefox parece codificar los mensajes POST de forma diferente que otros navegadores. En mi cabeza, Data-Type y Content-Type eran lo mismo y entonces, no me di cuenta de que era necesario especificar UTF-8 como el estándar de codificación de caracteres en ambos casos. Pero una vez que cambié tanto el Content-Type como el Data-Type y un texto "xml; charset = UTF-8", se resolvió el problema.

1

Estoy tan feliz. Gracias a todos por publicar y descubrir esto antes. Me tomó un par de horas acercarme lo suficiente al problema para encontrar esto a través de Google, pero debido a sus comentarios, lo solucioné en menos de un día; ¡y a tiempo para la gran presentación de mañana! :)

era tan extraño, viendo que todos los navegadores estaban enviando la misma cadena de datos en una petición AJAX pero conseguir resultados diferentes, dependiendo del navegador (Firefox ser diferente.)

yo probamos este, pero no funcionó:

req.setRequestHeader ("codificación", "utf-8");

Luego hice lo que dijiste Firefox y una solución de codificación funciona en todos los navegadores.

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

He probado en Chrome, MSIE, Firefox, Safari, Opera y Opera a continuación. Funciona todo el tiempo!

Cuestiones relacionadas