如何纠正IE8原生json中的字符编码?

发布于 2024-08-28 06:43:38 字数 642 浏览 8 评论 0原文

我正在使用 json 和 unicode 文本,并且 IE8 本机 json 实现有问题。

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

使用 json2.js 或 FireFox 原生 json,alert() 字符串与原始字符串相同。另一方面,IE8 返回 Unicode 值而不是原始文本 \u0e2a\u0e27\u0e31\u0e2a\u0e14\u0e35 ol\u00e9 。有没有一种简单的方法可以让 IE 表现得像其他浏览器一样,或者将此字符串转换为它应该的样子?您是否认为这是 IE 中的一个错误,我认为本机 json 实现应该是 json2.js 的相同替代品?

编辑:使用上述代码在 jsfiddle 上进行重现 - http://jsfiddle.net/vV4uz/

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\u00e9 . 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/

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

阳光①夏 2024-09-04 06:43:38

回答我自己的问题 - 显然这在 IE8 中是不可能的,但它在 IE9 Beta 中可以正常工作。

不过,修复是可能的:

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

它将正确alert()返回所有 IE、FF 和 Chrome 上的原始字符串。

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.

围归者 2024-09-04 06:43:38

如果这是在发送到服务器之前,您可以先对其进行编码
encodeURIComponent(JSON.stringify("สวัสดี olé"))
并在服务器上使用utf8解码器

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

神爱温柔 2024-09-04 06:43:38

确保您的服务器配置正确。我的正在回复,即使对于 unicode JSON 文件:

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

Ensure, your server is properly configured. Mine was replying, even for unicode JSON files:

Content-Type: text/html; charset=ISO-8859-1
清风夜微凉 2024-09-04 06:43:38

我认为正则表达式:

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

太激进了。如果您的输入中有一个不是 UTF 字符的字符串“\u”,它仍然会捕获它。

我想你需要的是这样的:

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

如果 x 是数字并且整个序列不以反斜杠 (\) 开头,则这只会更改 \uxxxx 序列。

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 (\).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文