2010-10-24 62 views
0

我使用php的json_encode()將數組轉換爲json,然後回顯它並從javascript ajax請求中讀取。javascript json - 從php解碼ajax json數組的問題

問題是echo'd文本有javascript json parse()函數無法轉換的unicode字符。

數組值爲「2 \ u00000 \ u00001 \ u00000 \ u0000- \ u00001 \ u00000 \ u0000- \ u00000 \ u00001」,即「2010-10-01」。

Json.parse()只給我「2」。

任何人都可以幫我解決這個問題嗎?

實施例:

  var resArray = JSON.parse(this.responseText); 
      for(var x=0; x < resArray.length; x++) { 
       var twt = resArray[x]; 
       alert(twt.date); 
       break; 
      } 
+0

您正在使用哪個'JSON.parse()'?在哪些瀏覽器中試用? – 2010-10-24 11:20:54

+0

更新後的帖子 – Joe 2010-10-24 11:24:13

回答

1

你必須在字符串中的字符NUL(字符代碼零)。它實際上是"2_0_1_0_-_1_0_-_0_1",其中_代表NUL字符。

unicode字符轉義實際上是JSON標準的一部分,所以解析器應該正確處理。但是,結果仍然是一個字符串,它會包含NUL字符,所以當您嘗試在Javascript中使用字符串時,行爲將取決於瀏覽器對NUL字符所做的操作。

您可以在一些不同的瀏覽器試試這個:

alert('as\u0000df'); 

Internet Explorer將只顯示as

Firefox將顯示asdf但NULL字符不顯示。

最好的解決方案是在將數據轉換爲JSON之前刪除NUL字符。

+0

這個幫助!事實上在php數組中存在垃圾字符(不可見),所以正在運行「preg_replace('/ [\ x00- \ x1F \ x80- \ xFF] /','',$ string)」完全解決了這個問題。 – Joe 2010-10-24 11:38:34

1

要添加什麼Guffa說:

當您交替零個字節,什麼幾乎肯定發生的情況是,你讀過UTF-16數據源,而不將其轉換成ASCII兼容的編碼,如UTF-8。雖然你可以扔掉空值,但是如果它包含ASCII範圍以外的任何字符,這將破壞字符串。 (當然不是日期字符串的問題,但它可能會影響您從同一來源讀取的任何其他字符串。)

檢查您的PHP代碼在哪裏讀取2010-10-01字符串,並將其即時轉換使用例如iconv('utf-16le', 'utf-8', $string),或更改來源以使用更合理的編碼。例如,如果它是一個文本文件,請使用'UTF-8 without BOM'將其保存在文本編輯器中,而不是'Unicode',這是Windows文本編輯器用來表示UTF-16LE的非常具有誤導性的名稱。