Привет, у меня есть скрипт для общения с арабом, который использует Ajax для получения ответа от сервера после заполнения формы.
На некоторых серверах apache jQuery.parseJSON()
выдает invalid json
exccepion для того же json, который отлично разбирается на других серверах. Это исключение выбрасывается только на хром и IE.
Содержимое json кодируется с помощью функции json_encode()
php. Я попытался отправить правильный заголовок с данными json и установить unicode в utf-8, но это не помогло.
Это один из ответов json, которые я пытаюсь проанализировать (удалить вторую часть if, потому что она длинная):
{"pageTitle":"\u062e\u0637\u0623 \u0639\u0646\u062f \u0627\u0644\u0625\u0631\u0633\u0627\u0644 !"}
Примечание . Этот язык этих данных является арабским, поэтому он выглядит следующим образом после анализа json_encode()
php.
Вы можете попытаться сделать запрос в приведенных примерах и посмотреть полные данные ответа с помощью средств разработки firebug или webkit. Ответ проходит jsonlint !
Наконец, у меня есть два URL-адреса, использующих одну и ту же версию скрипта, попробуйте просмотреть их с помощью chrome или IE, чтобы увидеть ошибку в сломанном примере.
Рабочий пример : http://namodg.com/n/
Сломанный пример : http://www.mt-is.co.cc/my/call-me/
Обновлено: Чтобы уточнить больше, я хотел бы отметить, что я решил исправить это, используя старый eval()
для анализа содержимого, я выпустил еще одну версию с этим исправлением, это было так:
// Parse the JSON data try { // Use jquery's default parser data = $.parseJSON(data); } catch(e) { /* * Fix a bug where strange unicode chars in the json data makes the jQuery * parseJSON() throw an error (only on some servers), by using the old eval() - slower though! */ data = eval( "(" + data + ")" ); }
Я все еще хочу знать, является ли это ошибкой в parseJSON()
jquery, поэтому я могу сообщить об этом им.
Нашел проблему! Это было очень трудно заметить, но я увидел что-то смешное в этой открывающей скобе … рядом с ним было несколько маленьких точек. Я использовал этот букмарклет JavaScript, чтобы узнать, что это было:
javascript:window.location='http://www.google.com/search?q=u+'+('000'+prompt('String?').charCodeAt(prompt('Index?')).toString(16)).slice(-4)
Я получил страницу результатов . Угадайте, в чем проблема! В начале вашего вывода есть невидимый персонаж, который повторяется дважды. Неразрывное пространство с нулевой шириной также называется меткой порядка байтов Юникода (BOM) . Это причина, по которой jQuery отклоняет ваш действующий JSON, и почему вставка JSON в JSONLint таинственно работает (в зависимости от того, как вы это делаете).
Один из способов получить этот нежелательный символ в ваш вывод – сохранить ваши файлы PHP с помощью Windows Notepad в режиме UTF-8! Если это то, что вы делаете, получите другой текстовый редактор, например Notepad ++ . Сохраните все ваши файлы PHP без спецификации, чтобы исправить вашу проблему.
Шаг 1: Установите Notepad ++ для кодирования файлов в UTF-8 без спецификации по умолчанию.
Шаг 2. Откройте каждый существующий файл PHP, измените настройку кодировки и сохраните его.
Вы должны попробовать использовать json2.js (он находится на https://github.com/douglascrockford/JSON-js )
Даже Джон Ресиг (создатель jQuery) говорит, что вы должны:
Настоятельно рекомендуется использовать эту версию JSON.js. Если вы все еще используете старую версию, пожалуйста, обновите (этот, несомненно, вызывает меньше проблем, чем предыдущий).
Я не вижу ничего, связанного с parseJSON ()
Единственное различие, которое я вижу, заключается в том, что в рабочем примере установлен сеансовый файл cookie (предположим, что это необходимо для «капчей», математического расчета), в другом примере не установлено cookie сеанса. Поэтому, возможно, сравнение результата вычисления не выполняется без cookie сеанса.