2010-10-24 3 views
0

Я использую php's json_encode() для преобразования массива в json, который затем является эхом и считывается из запроса ajax javascript.javascript json - проблема декодирования ajax json array от php

Проблема: текст echo'd имеет символы юникода, которые функция javascript json parse() не преобразует.

Пример значения массива - «2 \ u0000 \ u00001 \ u00000 \ u0000- \ u00001 \ u0000 \ 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() 'вы используете точно? В каких браузерах вы пытаетесь это сделать? –

+0

Обновлено сообщение – Joe

ответ

1

У вас есть символы NUL (код символа ноль) в строке. На самом деле это "2_0_1_0_-_1_0_-_0_1", где _ представляет символы NUL.

Вызов символа Unicode на самом деле является частью стандарта JSON, поэтому анализатор должен правильно его обрабатывать. Однако результат по-прежнему остается в нем символом NUL, поэтому, когда вы пытаетесь использовать строку в Javascript, поведение будет зависеть от того, что браузер делает с символами NUL.

Вы можете попробовать это в некоторых различных браузерах:

alert('as\u0000df'); 

Internet Explorer будет отображаться только as

Firefox будет отображать asdf но символ NUL не отображается.

Лучшим решением было бы удалить символы NUL перед преобразованием данных в JSON.

+0

это помогло! Оказывается, в массиве php присутствовали символы мусора (не видимые), так что «preg_replace ('/ [\ x00- \ x1F \ x80- \ xFF] /', '', $ string)" полностью исправил проблему. – Joe

1

Чтобы добавить к тому, что сказал Guffa:

При чередующиеся нулевые байты, то, что почти наверняка произошло то, что вы читали источник данных UTF-16 без преобразования его в ASCII-совместимого кодирования, таких как UTF-8. В то время как вы можете выбросить нули, это приведет к искажению строки, если она содержит любые символы вне диапазона ASCII. (Конечно, это не проблема для строк даты, но это может повлиять на любые другие строки, которые вы читаете из того же источника.)

Проверьте, где ваш код PHP читает строку 2010-10-01, и либо конвертируйте ее на лету используя, например, iconv('utf-16le', 'utf-8', $string), или измените источник, чтобы использовать более разумное кодирование. Если это текстовый файл, например, сохраните его в текстовом редакторе, используя «UTF-8 без спецификации», а не «Юникод», что является очень вводящим в заблуждение именем. Текстовые редакторы Windows используют для обозначения UTF-16LE.