Кодировка символов JSON - UTF-8 хорошо поддерживается браузерами, или я должен использовать числовые escape-последовательности?

Вы можете реализовать бинарный поиск в начальных интервалах, чтобы уменьшить временную сложность каждого поиска до log (N). Например, пусть

label = [10,11]
intervals = [(1,3), (5,12), (16,20)]

Поскольку интервалы не перекрываются, нам нужно найти начало первого интервала меньше или равно началу метки.

    int val = 10;
    int arr[] = {1,5,16};

    int low = 0;
    int high = arr.length-1;

    while(high>=low)
    {
        int mid = low + (high-low)/2;
        if(arr[mid] == val)
            return arr[mid];
        else if(high == arr.length-1 && arr[mid]<val)
            return arr[high];
        else if(low == 0 && arr[mid]>val)
            return arr[low];
        else if(arr[mid]>val)
            high = mid-1;
        else
            low = mid+1;
    }

    System.out.println(arr[low]);

Здесь результат будет 5. Теперь мы можем легко проверить, принадлежит ли данный ярлык этому интервалу или нет.

78
задан thomasrutter 25 March 2014 в 02:39
поделиться

3 ответа

Спецификация JSON требует поддержка UTF-8 декодерами. В результате все декодеры JSON могут обработать UTF-8, точно так же как они могут обработать числовые escape-последовательности. Это также имеет место для интерпретаторов JavaScript, что означает, что JSONP обработает закодированный JSON UTF-8 также.

способность к кодерам JSON для использования числовых escape-последовательностей вместо этого просто предлагает Вам больше выбора. Одна причина можно выбрать числовые escape-последовательности, состояла бы в том, если транспортный механизм промежуточный кодер и намеченный декодер не двоично-безопасен.

Другая причина можно хотеть использовать числовые escape-последовательности, должен предотвратить определенные символы, появляющиеся в потоке, такой как <, & и ", который может быть интерпретирован, поскольку HTML упорядочивает, если код JSON помещается, не выходя в HTML, или браузер неправильно интерпретирует его как HTML. Это может быть защитой против инжекции HTML или сценариев перекрестного сайта (примечание: некоторые символы MUST быть оставленным в JSON, включая " и \).

Некоторые платформы, включая реализацию PHP JSON, всегда делают числовые escape-последовательности на стороне кодера для любого символа за пределами ASCII. Это предназначается для максимальной совместимости с ограниченными транспортными механизмами и т.п.. Однако это не должно быть интерпретировано как признак, что декодеры JSON имеют проблему с UTF-8.

Так, я предполагаю, что Вы просто могли решить, чтобы использовать как это:

  • Просто использование UTF-8, если Ваш метод устройства хранения данных или транспорта между кодером и декодером не двоично-безопасен.

  • Иначе, используйте числовые escape-последовательности.

77
ответ дан thomasrutter 24 November 2019 в 10:38
поделиться

ASCII больше не находится в нем. Используя средства кодировки UTF-8, что Вы не используете кодирование ASCII. То, для чего необходимо использовать механизм выхода, - то, что говорит RFC:

символы All Unicode могут быть помещены в кавычках за исключением символов, которых нужно оставить: кавычка, реверс solidus и управляющие символы (U+0000 через U+001F)

12
ответ дан chaos 24 November 2019 в 10:38
поделиться

У меня возникла проблема. Когда я JSON кодирую строку с таким символом, как «é», все браузеры будут возвращать то же «é», за исключением IE, который вернет «\ u00e9».

Затем с PHP json_decode () он потерпит неудачу, если найдет "é", поэтому для Firefox, Opera, Safari и Chrome я должен вызывать utf8_encode () перед json_decode ().

Примечание: в моих тестах IE и Firefox используют собственный объект JSON, другие браузеры используют json2.js.

16
ответ дан 24 November 2019 в 10:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: