I am using json with unicode text, and am having a problem with the IE8 native json implementation.
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script>
var stringified = JSON.stringify("สวัสดี olé");
alert(stringified);
</script>
Using json2.js or FireFox native json, the alert()
string is the same as in the original one. IE8 on the other hand returns Unicode values rather than the original text \u0e2a\u0e27\u0e31\u0e2a\u0e14\u0e35 ol\u0开发者_Python百科0e9
. Is there an easy way to make IE behave like the others, or convert this string to how it should be ? And would you regard this as a bug in IE, I thought native json implementations were supposed to be drop-in identical replacements for json2.js ?
Edit: An repro on jsfiddle using the above code - http://jsfiddle.net/vV4uz/
To answer my own question - Apparently this is not natively possible in IE8, but it does work correctly in the IE9 Beta.
A fix is possible though:
<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>
Which will correctly alert() back the original string on all of IE, FF and Chrome.
If this is before sending to the server, you can encode it first encodeURIComponent(JSON.stringify("สวัสดี olé")) and use a utf8 decoder on the server
Ensure, your server is properly configured. Mine was replying, even for unicode JSON files:
Content-Type: text/html; charset=ISO-8859-1
I think regexp:
unescape(stringified.replace(/\u/g, '%u'));
is too aggresive. If you had a string '\u' in your input that wasn't the UTF character, it would still catch it.
I think what you need is this:
unescape(stringified.replace(/([^\\])\\u([0-9][0-9][0-9][0-9])/g,"$1%u$2"));
This would only change \uxxxx sequences if x is a digit and the whole sequence is not proceeded by a backslash (\).
精彩评论