2010-04-03 12 views
7

Sto usando json con testo unicode e sto avendo un problema con l'implementazione json nativa di IE8.Come correggere la codifica dei caratteri in IE8 nativo JSON?

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<script> 
    var stringified = JSON.stringify("สวัสดี olé"); 
    alert(stringified); 
</script> 

Utilizzando json2.js o Firefox JSON nativa, la stringa alert() è la stessa come in quella originale. D'altra parte, IE8 restituisce valori Unicode anziché il testo originale \u0e2a\u0e27\u0e31\u0e2a\u0e14\u0e35 ol\u00e9. C'è un modo semplice per far sì che IE si comporti come gli altri, o convertire questa stringa in come dovrebbe essere? E lo considereresti un bug in IE, pensavo che le implementazioni di json nativi dovessero essere rimpiazzate con identiche sostituzioni per json2.js?

Edit: Un repro sul jsfiddle utilizzando il codice di cui sopra - http://jsfiddle.net/vV4uz/

+0

Questo è un bug chiaro in Internet Explorer: JSON deve essere considerato codificato in unicode, vedere [RFC 4627] (http://www.ietf.org/rfc/rfc4627.txt) – rds

risposta

7

Per rispondere alla mia stessa domanda - Apparentemente questo non è nativamente possibile in IE8, ma funziona correttamente in IE9 Beta.

Un fix è possibile però:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<script> 
    var stringified = JSON.stringify("สวัสดี olé"); 
    stringified = unescape(stringified.replace(/\\u/g, '%u')); 
    alert(stringified); 
</script> 

che sarà correttamente alert() tornare stringa originale su tutti i IE, FF e Chrome.

+0

Strano. Ho dato un'occhiata a http://www.browserstack.com/ per il mio sito e tutte le versioni di IE 6-10 sono interessate – rds

1

Se questa è la prima di inviare al server, è possibile codificare prima encodeURIComponent (JSON.stringify ("สวัสดี olé")) e l'uso un decodificatore utf8 sul server

+0

Grazie. Non mi interessa fare la decodifica sul server, se necessario, anche se non è l'ideale in quanto significherebbe che il server ottiene valori diversi a seconda del browser utilizzato. Come potrei allora "utf 8 decodificarlo sul server" però (in C#), sono ancora un po 'perso ...? Uso già encodeURIComponent quando invio al server, ma questo non cambia il problema. – mikel

+0

http://briancaos.wordpress.com/2009/03/31/decodeuricomponent-equivalent-in-c/ Non vedo perché si otterrebbero dati diversi a seconda del browser, IE e FF supportano entrambi cododeURIComponent – mplungjan

+0

I dati passato è diverso a seconda del browser (come nella domanda originale), quindi anche l'output è diverso.encodeURIComponent mi consente di spostare il problema da client a server, ma sto ancora cercando un modo per correggere il problema con Javascript sul client o C# sul server. – mikel

0

Verificare che il server sia configurato correttamente. La mia era la risposta, anche per i file JSON unicode:

Content-Type: text/html; charset=ISO-8859-1 
0

penso regexp:

unescape (stringified.replace (/ \ u/g, '% u'));

è troppo aggressivo. Se avevi una stringa '\ u' nel tuo input che non era il carattere UTF, sarebbe comunque in grado di catturarla.

Penso che quello che vi serve è questo:

unescape (stringified.replace (/ ([^ \\]) \\ u ([0-9] [0-9] [0-9 ] [0-9])/g, "$ 1% u $ 2"));

Questo cambierebbe solo le sequenze \ uxxxx se x è una cifra e l'intera sequenza non è preceduta da una barra retroversa (\).

Problemi correlati