本来一直用json2.js来做客户端的JSON的parse和stringify,
现在ie8因为原生支持json,所以浏览器自带了JSON.parse与JSON.stringify两个方法,
现在问题是当需要stringify的对象中包含中文时,ie8的方法会将中文转为unicode编码格式,比如下面:
var json = '{"PermID":"30","PermName":"普通员工级","Re":"最基层员工使用的权限。"}';
var o = JSON.parse(json);
document.write(JSON.stringify(o));
会输出如下结果:
{"PermID":"30","PermName":"\u666e\u901a\u5458\u5de5\u7ea7","Re":"\u6700\u57fa\u5c42\u5458\u5de5\u4f7f\u7528\u7684\u6743\u9650\u3002"}这样的结果如果用XHR直接POST到服务器上中文会是乱码,现在我只好不用IE8的原生对象。
不知道哪位大侠有什么更好的办法既能用IE8原生的对象,又能避免乱码。

解决方案 »

  1.   

    没有ie8,既然可以解决.lz难道只希望自己的程序在ie8上跑吗?
      

  2.   

    ie8有内置有JSON对象吗?我测试好像没有。
      

  3.   

    我倒是觉得使用json2.js, 并且统一所有页面包括js使用utf-8编码更通用一些。
      

  4.   

    firefox 3.5也支持了。相信很多浏览器也会支持的
      

  5.   


    script5.8版本内置了JSON对象,这样JSON的解析更快更安全,
    json2.js本来就只对不支持内置对象的浏览器起作用。
      

  6.   

    不知道这样符不符合LZ的要求
    <script>
    var str = '{"PermID":"30","PermName":"\\u666e\\u901a\\u5458\\u5de5\\u7ea7","Re":"\\u6700\\u57fa\\u5c42\\u5458\\u5de5\\u4f7f\\u7528\\u7684\\u6743\\u9650\\u3002"}';
    alert(str);
    eval("var str1 = '"+str+"';");
    alert(str1);
    </script>var json = '{"PermID":"30","PermName":"普通员工级","Re":"最基层员工使用的权限。"}';
    var o = JSON.parse(json);
    eval("var str = '"+JSON.stringify(o)+"';");
    document.write(str);
      

  7.   

    还真不知道IE8自带了JSON 看来7L好像已经给了解决方案了,关注一下
      

  8.   

    7楼搞错了吧。js里面这些乱码无所谓,关键是服务器端lz用的是什么服务器端?asp?jsp?php?
      

  9.   

    这可不是乱码,这是中文的ASCII码,利用eval转换一下即可
      

  10.   

    客户端无所谓了,使用肯定不受影响;
    关键是POST到服务端会影响服务器端的使用,例如写库。
    那只好自己写个转换函数了。
    我简单的写了个ASP转换函数:
    <%
    s="\u666e\u901a\u5458\u5de5\u7ea7" 
    Response.Write ConvChinese(s)'转换为汉字函数
    function ConvChinese(s)
      dim temp,arr
      arr=split(s,"\u")
      for i=1 to ubound(arr)
        if temp="" then temp=chrW(int("&H" & arr(i))) else temp=temp&chrW(int("&H" & arr(i)))
      next
      ConvChinese=temp
    end function%>
      

  11.   

    谢谢7楼和12楼,
    如果再用eval来转一下,则有点多余,还不如我现在的办法——强制用json2.js的stringify方法。
    服务器端我用的是.net2.0,如果直接用XHR提交过去,不能正确识别中文,但是这种情况仅发生在IE8下,
    FF3.5、chrome2.0、safari、opera都没有问题。
    我觉得总不能因为客户端浏览器的不同来影响服务器端的代码,所以现在只好采用折中的办法,不使用IE8的内置对象。另外,IE8可能不成熟,这是我发的另一个帖子,不知道是不是IE8的BUG
    http://topic.csdn.net/u/20090731/16/3d7eb160-f043-4f9f-a16c-d07a3641e6ed.html
      

  12.   

    IE8肯定不成熟要继续打补丁的。你新帖子看了,真可能就是BUG. 我没测试,前些天已经卸载IE8,就像你说的用开发人员工具动不动就CPU100%甚至死机。怀疑是多线程处理上有问题。等它的补丁吧,呵呵。【我觉得总不能因为客户端浏览器的不同来影响服务器端的代码】:其实就是判断一下XHR的数据里是否含有十六进制\u字符,有就转换,没有就不转换。网上看到,似乎可以"重写"IE8的JSON,没仔细研究:))当然,直接不用它的JSON也是一个办法,等它改进再说,呵呵
      

  13.   

    我现在都不敢装IE8,只用IETester来测试,IE8带来是更多的特性和更多的bug
      

  14.   


    主要是我的数据在提交到服务器之前为保证安全肯定要encodeURIComponent一下。
    这一来就把\u给URI编码了,而这个\u的特殊情况又只在IE8下出现,说不定哪天IE8一升级又变了。
    所以不能让它来影响服务器端程序。另外,另一个帖子中的问题也确认了不是IE8的BUG,而是IE8下DOM元素固有了role属性,所以导致对象作用域的改变而引发错误。
      

  15.   

    怎么才能不用它提供的json呢?
      

  16.   

    其实的把json2.js中的if (!this.JSON) 这个判断去除就可以了既然你想用json2的话