Сравнение JavaScript методов escape(), encodeURI(), и encodeURIComponent()
Цель статьи - определить различия этих трех методов при кодировании строк. В каком случае и какой из них лучше использовать.
Метод escape()
Определен в JavaScript 1.0
Описание:
MSDN JScript Reference
Метод escape()
возвращает строку (в формате Unicode) . Все пробелы, пунктуация и любые не-ASCII символы в ней закодированы и выглядят как %xx, где xx эквивалентно шестнадцатиричному числу, обозначающему символ. Например, пробелы будут возвращены как "%20".
Символы, числовые значения которых больше 255 будут представлены в формате %uxxxx.
Netscape DevEdge Core Javascript Guide
Функции escape и unescape дают возможность кодировать и декодировать строки. Функция escape возвращает шестнадцатиричное представление аргумента в кодировке ISO Latin. Функция unescape возвращает ASCII строку из шестнадцатиричной кодировки символов.
Пример:
Чтобы понять поведение метода - надо дать ему строку символов и посмотреть на то, что он вернет:
escape('!@#$%^&*(){}[]=:/;?+\'"'):
Метод encodeURI()
Определен в JavaScript 1.5
Описание:
MSDN JScript Reference
Метод encodeURI()
возвращает закодированный URI. Если к результату применить метод decodeURI
, будет возвращена исходная строка. Метод encodeURI()
не кодирует следущие символы: ":", "/", ";" и "?".
Для того, чтобы закодировать эти символы, следует использовать encodeURIComponent
.
Netscape DevEdge Core Javascript Guide
Кодирует Uniform Resource Identifier (URI), замещая некоторые символы escape-последовательностями, представляющими эти символы в кодировке UTF-8.
Пример:
Чтобы понять поведение метода - надо дать ему строку символов и посмотреть на то, что он вернет:
encodeURI('!@#$%^&*(){}[]=:/;?+\'"'):
Метод encodeURIComponent()
Определен в JavaScript 1.5
Описание:
MSDN JScript Reference
Метод encodeURIComponent()
возвращает закодированный URI. Если к результату применить метод decodeURIComponent
, будет возвращена исходная строка. Метод encodeURIComponent
кодирует все символы, поэтому будьте внимательны, если строка представляет путь к файлу: /folder1/folder2/default.html. Слэши будут закодированы и не пригодны к отправке веб-серверу в качестве запроса. Следует использовать метод encodeURI
если строка содержит более одного компонента URI.
Netscape DevEdge Core Javascript Guide
Кодирует компоненты Uniform Resource Identifier (URI), замещая некоторые символы escape-последовательностями, представляющими эти символы в кодировке UTF-8.
Пример:
Чтобы понять поведение метода - надо дать ему строку символов и посмотреть на то, что он вернет:
encodeURIComponent('!@#$%^&*(){}[]=:/;?+\'"'):
Три метода вместе:
escape()
:encodeURI()
:encodeURIComponent()
:Подводя итог
Что и в каком случае использовать?
Метод escape()
не кодирует символ "+", который может быть принят как пробел на стороне сервера и его можно использовать для передачи пробелов в полях форм. Соответственно, чтобы обойти этот дефект, лучше не использовать escape()
когда это возможно. В качестве альтернативы лучше использовать encodeURIComponent()
.
escape()
не кодирует символы: @*/+.
?спользование метода encodeURI()
лучше чем escape()
приспособлено для кодирования всего URI, а не запроса, являющегося частью URL. Этот метод следует использовать в случае, когда надо закодировать URI полностью для отправки запроса веб-серверу, при этом некоторые символы не нужно кодировать.
encodeURI()
не кодирует символы: !@#$&*()=:/;?+'.
Метод encodeURIComponent()
лучше использовать для кодирования отдельных частей (компонентов) URI. ?м кодируются все символы, которые могут являться спецсимволами URI, например, символ слэша "/".
encodeURIComponent()
не кодирует символы: !*()'.
Ссылки
Оригинал статьи - Comparing escape(), encodeURI(), and encodeURIComponent()
MSDN JScript Reference - escape(), encodeURI(), encodeURIComponent()
ASCII Table - http://asciitable.com/
W3C's URIs, URLs, and URNs: Clarifications and Recommendations 1.0 - http://w3.org/TR/uri-clarification/
РАЗличия
отличие от
различие между
2006-05-26 at 10:12 am
о, я думал вы померли уже :)
2006-05-26 at 10:24 am
amix, спасибо, поправил
john, еще нет, но тоже спасибо :)
2006-05-26 at 12:28 pm
Я уж и забыл, что у меня rss на этот сайт настроен =)
Ресурс хороший – не бросайте его.
Правду в массы, байты в классы! брррр
2006-05-26 at 3:39 pm
svnk, аналогично.
Баранов Андрей, а нельзя написать свою функцию, которая кодирует все и не мучиться выбором?
2006-05-27 at 11:44 am
Редко в последнее время, но метко. Толковая статья, спасибо, Андрей!
2006-05-27 at 5:16 pm
rdm, можно, только есть ли смысл?
Существуют готовые функции, важно лишь определиться в каком случае надо использовать тот или иной метод. Наверное, следует немного “разжевать” концовку статьи:
encodeURI() лучше использовать для кодирования полного URI, т.е. ему для обработки передается строка “/?a=aaa&b=bbb&c=ccc”, при этом он не изменит символы ?/&=
encodeURIComponent() лучше использовать для кодирования отдельных частей URI, т.е. “aaa” или “bbb” или “ссс”, т.к. если ему скормить сразу всю строку URI, он ее вернет испорченной, закодировав и управляющие символы ?/&=
Как вариант, можно перебрать массив из значений полей формы, применить к каждому из них метод encodeURIComponent(), а затем собрать запрос “/?a=aaa&b=bbb&c=ccc”.
2006-05-27 at 8:53 pm
+ http://xpoint.ru/know-how/JavaScript/PoleznyieFunktsii#EscapeSovmestimyiySRusskimiBuk
2006-06-07 at 7:59 pm
Я использую encodeURIComponent() для передачи ява-скриптом некоторого полного URI GET-методом. В моем случае это для сбора статистики.
2006-06-09 at 10:45 am
мне пришлось использовать такую конструкцию: escape(encodeURIComponent(”хелло ворлд”)) для добавления параметра к строке URL, которую потом использовал для AJAX-запросса. Проблема в том, что иначе параметр со значением в русских символах не хотел потом подниматься из объекта HttpServletRequest. Я на такую конструкцию вышел чистым перебором. Работает, а почему – точно не знаю. Кто может ответить, что я получаю таким преобразованием?
2008-05-28 at 6:31 pm
Че то я не понял а как обратно?
С уважением http://bairam.biz
2008-09-17 at 9:19 am