ie8的原生json解析与序列化的问题

xuStanly 2009-07-30 10:39:38
本来一直用json2.js来做客户端的JSON的parse和stringify,
现在ie8因为原生支持json,所以浏览器自带了JSON.parse与JSON.stringify两个方法,
现在问题是当需要stringify的对象中包含中文时,ie8的方法会将中文转为unicode编码格式,比如下面:
var json = '{"PermID":"30","PermName":"普通员工级","Remark":"最基层员工使用的权限。"}';
var o = JSON.parse(json);
document.write(JSON.stringify(o));


会输出如下结果:
{"PermID":"30","PermName":"\u666e\u901a\u5458\u5de5\u7ea7","Remark":"\u6700\u57fa\u5c42\u5458\u5de5\u4f7f\u7528\u7684\u6743\u9650\u3002"}

这样的结果如果用XHR直接POST到服务器上中文会是乱码,现在我只好不用IE8的原生对象。
不知道哪位大侠有什么更好的办法既能用IE8原生的对象,又能避免乱码。
...全文
467 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
MicheasXu 2009-10-10
  • 打赏
  • 举报
回复
其实的把json2.js中的if (!this.JSON) 这个判断去除就可以了。。。既然你想用json2的话
tabtab123 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 toury 的回复:]
IE8肯定不成熟要继续打补丁的。你新帖子看了,真可能就是BUG. 我没测试,前些天已经卸载IE8,就像你说的用开发人员工具动不动就CPU100%甚至死机。怀疑是多线程处理上有问题。等它的补丁吧,呵呵。

【我觉得总不能因为客户端浏览器的不同来影响服务器端的代码】:其实就是判断一下XHR的数据里是否含有十六进制\u字符,有就转换,没有就不转换。

网上看到,似乎可以"重写"IE8的JSON,没仔细研究:))

当然,直接不用它的JSON也是一个办法,等它改进再说,呵呵


[/Quote]


怎么才能不用它提供的json呢?
toury 2009-08-01
  • 打赏
  • 举报
回复
IE8肯定不成熟要继续打补丁的。你新帖子看了,真可能就是BUG. 我没测试,前些天已经卸载IE8,就像你说的用开发人员工具动不动就CPU100%甚至死机。怀疑是多线程处理上有问题。等它的补丁吧,呵呵。

【我觉得总不能因为客户端浏览器的不同来影响服务器端的代码】:其实就是判断一下XHR的数据里是否含有十六进制\u字符,有就转换,没有就不转换。

网上看到,似乎可以"重写"IE8的JSON,没仔细研究:))

当然,直接不用它的JSON也是一个办法,等它改进再说,呵呵

xuStanly 2009-08-01
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 toury 的回复:]
其实就是判断一下XHR的数据里是否含有十六进制\u字符,有就转换,没有就不转换。
[/Quote]

主要是我的数据在提交到服务器之前为保证安全肯定要encodeURIComponent一下。
这一来就把\u给URI编码了,而这个\u的特殊情况又只在IE8下出现,说不定哪天IE8一升级又变了。
所以不能让它来影响服务器端程序。

另外,另一个帖子中的问题也确认了不是IE8的BUG,而是IE8下DOM元素固有了role属性,所以导致对象作用域的改变而引发错误。
monexus 2009-08-01
  • 打赏
  • 举报
回复
我现在都不敢装IE8,只用IETester来测试,IE8带来是更多的特性和更多的bug
toury 2009-07-31
  • 打赏
  • 举报
回复
客户端无所谓了,使用肯定不受影响;
关键是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

%>
浪尖赏花 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 oldmht 的回复:]
7楼搞错了吧。js里面这些乱码无所谓,关键是服务器端。。。lz用的是什么服务器端?asp?jsp?php?
[/Quote]
这可不是乱码,这是中文的ASCII码,利用eval转换一下即可
oldmht 2009-07-31
  • 打赏
  • 举报
回复
7楼搞错了吧。js里面这些乱码无所谓,关键是服务器端。。。lz用的是什么服务器端?asp?jsp?php?
eugenepada 2009-07-31
  • 打赏
  • 举报
回复
还真不知道IE8自带了JSON

看来7L好像已经给了解决方案了,关注一下
xiongzhijian 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lihui_shine 的回复:]
不知道这样符不符合LZ的要求
JScript code<script>var str='{"PermID":"30","PermName":"\\u666e\\u901a\\u5458\\u5de5\\u7ea7","Remark":"\\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":"普通员工级","Remark":"最基层员工使用的权限。"}';
var o = JSON.parse(json);
eval("var str = '"+JSON.stringify(o)+"';");
document.write(str);

[/Quote]

正解...
浪尖赏花 2009-07-31
  • 打赏
  • 举报
回复
不知道这样符不符合LZ的要求
<script>
var str = '{"PermID":"30","PermName":"\\u666e\\u901a\\u5458\\u5de5\\u7ea7","Remark":"\\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":"普通员工级","Remark":"最基层员工使用的权限。"}';
var o = JSON.parse(json);
eval("var str = '"+JSON.stringify(o)+"';");
document.write(str);
xuStanly 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cpp2017 的回复:]
没有ie8,既然可以解决.lz难道只希望自己的程序在ie8上跑吗?
[/Quote]

script5.8版本内置了JSON对象,这样JSON的解析更快更安全,
json2.js本来就只对不支持内置对象的浏览器起作用。
孟子E章 2009-07-31
  • 打赏
  • 举报
回复
firefox 3.5也支持了。相信很多浏览器也会支持的
xuStanly 2009-07-31
  • 打赏
  • 举报
回复
谢谢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
dh20156 2009-07-31
  • 打赏
  • 举报
回复
楼主可以搜索一些编码的帖子来看看
叶子 2009-07-31
  • 打赏
  • 举报
回复
学习
virus7581 2009-07-31
  • 打赏
  • 举报
回复
up
Formular1 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xiongzhijian 的回复:]
引用 7 楼 lihui_shine 的回复:
不知道这样符不符合LZ的要求
JScript code <script>var str='{"PermID":"30","PermName":"\\u666e\\u901a\\u5458\\u5de5\\u7ea7","Remark":"\\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":"普通员工级","Remark":"最基层员工使用的权限。"}';
var o = JSON.parse(json);
eval("var str = '"+JSON.stringify(o)+"';");
document.write(str);



正解...
[/Quote]

赞一个!
sunxing007 2009-07-30
  • 打赏
  • 举报
回复
我倒是觉得使用json2.js, 并且统一所有页面包括js使用utf-8编码更通用一些。
sunxing007 2009-07-30
  • 打赏
  • 举报
回复
ie8有内置有JSON对象吗?我测试好像没有。
加载更多回复(2)

87,917

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧