decodeURIComponent против unescape: что не так с unescape?
Я столкнулся с тем, что мои знания по Javascript и DOM немного устарели. В процессе ответа на один вопрос я понял, что все еще использую функции escape и unescape для кодирования содержимого компонентов URL, хотя, судя по всему, теперь следует использовать encodeURIComponent и decodeURIComponent.
Меня интересует, в чем на самом деле проблема с escape и unescape? Есть некоторые неопределенные предположения о том, что существуют проблемы с символами Unicode, но я не смог найти четкого объяснения.
Мой опыт работы в веб-разработке значительно ограничен — почти все проекты касались разработки крупных интранет-приложений, привязанных к Internet Explorer. В этих проектах я активно использовал escape и unescape, и приложения полностью поддерживали Unicode на протяжении многих лет.
Так в чем же заключаются проблемы с Unicode, которые связаны с escape и unescape? Есть ли у кого-нибудь примеры тестовых случаев, чтобы продемонстрировать эти проблемы?
3 ответ(ов)
В общем, функции escape и unescape не являются "неправильными" в своем роде, но представляют собой специальный формат строк, который внешне похож на кодирование параметров URI, хотя на самом деле таковым не является. Вот основные моменты:
- Символ ‘+’ обозначает знак плюс, а не пробел.
- Для кодирования кодовых точек Unicode UTF-16 используется специальный формат “%uNNNN”, вместо кодирования байтов UTF-8.
Таким образом, если вы используете escape() для создания значений параметров URI, вы получите неверные результаты для строк, содержащих знак плюс или любые не-ASCII символы.
Функцию escape() можно использовать как внутреннюю схему кодирования только в JavaScript, например, для экранирования значений cookie. Однако теперь, когда все браузеры поддерживают encodeURIComponent (чего изначально не было), нет смысла использовать escape вместо этого.
На данный момент я знаю лишь одно современное применение для escape/unescape, а именно как способ быстро реализовать кодировщик/декодировщик UTF-8, используя обработку UTF-8 в URIComponent:
utf8bytes = unescape(encodeURIComponent(unicodecharacters));
unicodecharacters = decodeURIComponent(escape(utf8bytes));
В современном использовании, с которым я столкнулся, есть необходимость в парсинге URI-encoded строки, которая может содержать недопустимые байтовые последовательности UTF-8. В некоторых случаях decodeURIComponent может вызывать исключение. В таких случаях вам может понадобиться обработать это исключение и вернуться к использованию unescape.
Примером может служить строка 'tür', закодированная как 't%FCr', которую я видел, когда в адресную строку Firefox вставляются символы после знака '?'.
Наилучший ответ таков: это работает онлайн на этом сайте http://meyerweb.com/eric/tools/dencoder/.
Вот пример функции на JavaScript, которая декодирует URL:
function decode() {
var obj = document.getElementById('dencoder');
var encoded = obj.value;
obj.value = decodeURIComponent(encoded.replace(/\+/g, " "));
}
Эта функция берет строку, введенную в элемент с идентификатором dencoder, декодирует её из формата URL и обновляет значение этого элемента. Если у вас есть вопросы или нужны дополнительные пояснения, не стесняйтесь спрашивать!
Как получить фактическую ширину и высоту HTML-элемента?
Вставка HTML в представление из контроллера AngularJS
Потеряно HTML-кодирование при чтении атрибута из поля ввода
Экранирование строки для использования в регулярных выражениях JavaScript [duplicate]
Как напечатать только <div id="printarea"></div>?