Подтвердить что ты не робот

JSON.stringify и "\ u2028\u2029" проверить?

Иногда я см. на странице источника просмотра (источник просмотра html):

if (JSON.stringify(["\u2028\u2029"]) === '["\u2028\u2029"]') JSON.stringify = function (a) {
    var b = /\u2028/g,
        c = /\u2029/g;
    return function (d, e, f) {
        var g = a.call(this, d, e, f);
        if (g) {
            if (-1 < g.indexOf('\u2028')) g = g.replace(b, '\\u2028');
            if (-1 < g.indexOf('\u2029')) g = g.replace(c, '\\u2029');
        }
        return g;
    };
}(JSON.stringify);
  • В чем проблема с JSON.stringify(["\u2028\u2029"]), которую необходимо проверить?

Дополнительная информация:

  • JSON.stringify(["\u2028\u2029"]) Значение "["

"]" Значением
  • '["\u2028\u2029"]' также является "["

"]"
4b9b3361

Ответ 1

Я думал, что это может быть функция безопасности. FileFormat.info для 2028 и 2029 есть баннер с сообщением

Не используйте этот символ в именах доменов. Браузеры черный список из-за возможности фишинга.

Но оказывается, что разделители строк и абзацев \u2028 и \u2029 соответственно рассматриваются как новая строка в ES5 JavaScript.

От http://www.thespanner.co.uk/2011/07/25/the-json-specification-is-now-wrong/

\ u2028 и \u2029 символы, которые могут сломать все каналы JSON, поскольку строка будет содержать новую строку, и парсер JavaScript будет освобожден

Итак, вы видите патч для JSON.stringify. Также см. Node.js JavaScript-stringify

Изменить: Да, встроенный JSON-объект современных браузеров должен позаботиться об этом правильно. Однако я не могу найти ссылки на фактический источник, чтобы поддержать это. Поиск в хромовом коде не содержит никаких ошибок, которые могли бы потребовать добавления этого обходного пути вручную. Похоже, что Firefox 3.5 была первой версией, поддерживающей поддержку JSON, не совсем без ошибок. IE8 поддерживает его. Таким образом, это, вероятно, теперь ненужный патч, предполагая, что браузеры правильно выполнили спецификацию.

Ответ 2

Прочитав оба ответа, вот простое визуальное объяснение:

делая это

alert(JSON.stringify({"a":"sddd\u2028sssss"}))//может вызвать проблемы

будет предупреждать:

enter image description here

При изменении создателя проблем на что-то другое (например, от \u до \1u)

будет предупреждать:

enter image description here

Теперь позвольте вызывать функцию из моего исходного Q,

Повторите попытку alert(JSON.stringify({"a":"sddd\u2028sssss"})):

результат:

enter image description here

и теперь все счастливы.

Ответ 3

\u2028 и \u2029 являются невидимыми Unicode line и абзац разделители. Натурный метод JSON.stringify преобразует эти коды в их символическое представление (как JavaScript автоматически делает в строках), в результате чего "["

"]". Предоставленный вами код не позволяет JSON преобразовывать коды в символы и сохраняет их представление \uXXXX в выходной строке, т.е. Возвращает "["\u2028\u2029"]".