【问题标题】:How to correct character encoding in IE8 native json?如何更正 IE8 本机 json 中的字符编码?
【发布时间】:2011-02-03 23:21:09
【问题描述】:

我正在使用带有 unicode 文本的 json,但 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/

【问题讨论】:

  • 这是 Internet Explorer 中的一个明显错误:JSON 应被视为 unicode 编码,请参阅 RFC 4627

标签: javascript json internet-explorer unicode encoding


【解决方案1】:

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

【讨论】:

  • 谢谢。如果需要,我不介意在服务器上进行解码,尽管这并不理想,因为这意味着服务器会根据使用的浏览器获得不同的值。我将如何“在服务器上对其进行 utf 8 解码”(在 C# 中),但我仍然有点迷茫......?我在发送到服务器时已经使用了 encodeURIComponent,但这并没有真正改变问题。
  • briancaos.wordpress.com/2009/03/31/…我不明白为什么你会根据浏览器得到不同的数据,IE和FF都支持encodeURIComponent
  • 传入的数据因浏览器而异(如原始问题),因此输出也不同。 encodeURIComponent 只是让我将问题从客户端转移到服务器,但我仍在寻找一种方法来实际纠正客户端上的 Javascript 或服务器上的 C# 的问题。
【解决方案2】:

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

fix 是可能的:

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

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

【讨论】:

  • 奇怪。我在browserstack.com 上查看了我的网站,所有版本的 IE 6-10 都会受到影响
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    我认为正则表达式:

    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 序列。

    【讨论】:

      猜你喜欢
      • 2016-03-22
      • 2010-09-13
      • 2016-10-24
      • 2016-04-05
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 2013-07-12
      相关资源
      最近更新 更多