0

decodeURIComponent против unescape: что не так с unescape?

11

Я столкнулся с тем, что мои знания по Javascript и DOM немного устарели. В процессе ответа на один вопрос я понял, что все еще использую функции escape и unescape для кодирования содержимого компонентов URL, хотя, судя по всему, теперь следует использовать encodeURIComponent и decodeURIComponent.

Меня интересует, в чем на самом деле проблема с escape и unescape? Есть некоторые неопределенные предположения о том, что существуют проблемы с символами Unicode, но я не смог найти четкого объяснения.

Мой опыт работы в веб-разработке значительно ограничен — почти все проекты касались разработки крупных интранет-приложений, привязанных к Internet Explorer. В этих проектах я активно использовал escape и unescape, и приложения полностью поддерживали Unicode на протяжении многих лет.

Так в чем же заключаются проблемы с Unicode, которые связаны с escape и unescape? Есть ли у кого-нибудь примеры тестовых случаев, чтобы продемонстрировать эти проблемы?

3 ответ(ов)

0

В общем, функции 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));
0

В современном использовании, с которым я столкнулся, есть необходимость в парсинге URI-encoded строки, которая может содержать недопустимые байтовые последовательности UTF-8. В некоторых случаях decodeURIComponent может вызывать исключение. В таких случаях вам может понадобиться обработать это исключение и вернуться к использованию unescape.

Примером может служить строка 'tür', закодированная как 't%FCr', которую я видел, когда в адресную строку Firefox вставляются символы после знака '?'.

0

Наилучший ответ таков: это работает онлайн на этом сайте 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 и обновляет значение этого элемента. Если у вас есть вопросы или нужны дополнительные пояснения, не стесняйтесь спрашивать!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь