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>?