IE8中JSON.stringify方法對自動轉換unicode字符的解決方案


IE8內置了JSON對象,用以處理JSON數據。與標准方法的不同,IE8的JSON.stringify會把utf-8字符轉碼:

    var str = "我是程序員"
    var jsonstr = JSON.stringify(str) //""\u6211\u662f\u7a0b\u5e8f\u5458""

一般情況下,我們是在向服務器發送數據的時候,才調用這個方法。服務器端可以正確的解析,所以沒有什么問題。但是如果我們jsonstr還要在別的地方用到,那就需要做一些處理。

一種方法是使用eval:

    var parsed = eval('('+jsonstr+')') //"我是程序員"

但是,當我們對str調用了不止一次的話,這樣的方法還行嗎:

    var str = '我是程序員'
    var jsonstr = JSON.stringify(str) var another_jsonstr = JSON.stringify(jsonstr) //     var another_parsed = eval('('+another_jsonstr+')') another_parsed //""\u6211\u662f\u7a0b\u5e8f\u5458""

事實證明是不行的,那么我們寫一個方法,如果發現解析的結果有utf-8碼,就認為該字符串未解析完全,繼續調用eval解析:

  function IE8parse(json) { var re = /\\u[0-9A-Fa-f]{4}/, result result = eval('(' + json + ')') while (re.test(result)) { result = eval('(' + result + ')') } return result }
  IE8parse(another_jsonstr) //"我是程序員"

另一種方法是把IE8的JSON.stringify方法做一些處理,把它轉化后的字符串中的utf-8碼轉化回字符,注意,由於utf-8是可變長度編碼,所以當遇到非單字節字符時,這種解析方式會出問題(目前測試只在IE8中會出現,例如“\uD842\uDFB7”,對應的漢字為 "𠮷",IE8解析為空字符串)。

    function stringify(object){ var string = JSON.stringify(object) return string.replace(/\\u([0-9a-fA-F]{2,4})/g,function(string,matched){ return String.fromCharCode(parseInt(matched,16)) }) }

這樣,就可以解決掉IE8中JSON.stringify自動轉換utf-8字符帶來的不便了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM