2010-10-05 8 views
12

Cuando JSON.stringify() el siguiente código:Las diferencias en el resultado entre los navegadores JSON.stringify

var exampleObject = { "name" : "Žiga Kovač", "kraj" : "Žužemberk"}; 

consigo diferentes resultados entre los navegadores.

IE8 y Google Chrome retorno:

{"name":"\u017diga Kova\u010d","kraj":"\u017du\u017eemberk"} 

Mientras que Firefox y Opera retorno:

{"name":"Žiga Kovač","kraj":"Žužemberk"} 

estoy usando JSON aplicación nativa del navegador en los 4 navegadores. Si UNDEFINE la implementación JSON nativa y sustituirla por la de json.org, a continuación, todos los navegadores regresan:

{"name":"Žiga Kovač","kraj":"Žužemberk"} 

Por qué sucede esto, cuyo resultado es correcto y es posible hacer que todos los navegadores regresan:

{"name":"\u017diga Kova\u010d","kraj":"\u017du\u017eemberk"} 

?

+0

relacionadas: http://stackoverflow.com/questions/3550094/unicode-characters-from-json-stringify-to-real-unicode-characters –

Respuesta

12

Estas dos representaciones son absolutamente equivalente.

Uno usa secuencias de escape Unicode (\uxxxx) para representar un carácter Unicode, el otro usa un carácter Unicode real. json.org define una cadena como:

 
string 
    - "" 
    - "chars" 
chars 
    - char 
    - char chars 
char 
    - any Unicode character except " or \ or control characters 
    - one of: \" \\ \/ \b \f \n \r \t 
    - \u four-hex-digits 

No hay ninguna diferencia en las propias cadenas, sólo en su representación. Esto es lo mismo que hace HTML cuando usa ©, © o © para representar el signo de copyright.

+0

¿Cómo se convierte caracteres no ASCII en JSON desde Firefox y Opera en \ uXXXX? Necesito exactamente eso. – Matic

+0

@Matic: No entiendo para qué lo necesitarías? Es lo mismo, después de todo.Si tiene problemas para enviar estos datos a través del cable con '" Ž "' en lugar de '" \ u017d "', solo debe ajustar los encabezados Content-Type a UTF-8. – Tomalak

1

Todos son correctos. Algunos lo devuelven codificado en UTF-8, y algunos en ASCII.

4

Tanto el resultado de son correctos, siempre y cuando su primer ejemplo está codificado en UTF-8.

p. Ej. \ U017d ist sólo otra notación de Z (017d es la posición en UTF8-charset)

7

La versión 'correcta' (visible) es una cadena UTF-8, y la cadena escapada es una cadena ASCII con los códigos UTF8 de escape. Mientras que el primero se puede usar en un cuerpo HTTP (siempre que la codificación de contenido esté configurada en UTF8), el segundo también se puede usar en un encabezado de solicitud HTTP GET.

Si desea utilizar la versión UTF8 en una petición GET, tiene que escapar de ella en primer lugar, el uso de encodeURIComponent.

Cuando se recibe el contenido del lado del servidor, la aplicación nativa cadena se asegurará de que contiene exactamente los mismos datos (de todos los clientes), a condición de que la transmisión HTTP es correcta.

Su navegador generalmente manejar la codificación de la misma, si lo envía como un cuerpo HTTP POST.

+1

Es ['encodeURIComponent'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/encodeURIComponent) –

+0

sí, eso ... :) –

Cuestiones relacionadas