Comment corriger le codage des caractères dans IE8 native json?

J'utilise json avec un texte unicode et j'ai un problème avec IE8 native json implementation.

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

En utilisant json2.js ou FireFox native json, la chaîne alert() est identique à celle de l'original. IE8, d'autre part, renvoie les valeurs Unicode plutôt que le texte original \u0e2a\u0e27\u0e31\u0e2a\u0e14\u0e35 ol\u00e9 . Existe-t-il un moyen simple de faire IE se comporter comme les autres, ou de convertir cette chaîne sur la façon dont elle devrait l'être? Et pourriez-vous considérer cela comme un bogue dans IE, je pensais que les implémentations de json natif étaient censées être des remplacements identiques dans json2.js?

Edit: Un repro sur jsfiddle en utilisant le code ci-dessus – http://jsfiddle.net/vV4uz/

Pour répondre à ma propre question – Apparemment, ce n'est pas possible nativement dans IE8, mais ça marche correctement dans IE9 Beta.

Une correction est cependant possible:

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

Ce qui alerte correctement () renvoie la chaîne d'origine sur tous les fichiers IE, FF et Chrome.

Si c'est avant d'envoyer au serveur, vous pouvez l'encoder en premier encodeURIComponent (JSON.stringify ("สวัสดี olé")) et utiliser un décodeur utf8 sur le serveur

Assurez-vous que votre serveur est correctement configuré. La Mine a répondu, même pour les fichiers JSON Unicode:

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

Je pense que regexp:

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

Est trop agressif. Si vous aviez une chaîne '\ u' dans votre saisie qui n'était pas le caractère UTF, il l'attraperait toujours.

Je pense que vous avez besoin de ceci:

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

Cela ne changerait que les séquences \ uxxxx si x est un chiffre et que la séquence entière n'est pas poursuivie par une barre oblique inverse (\).