При кодировании строки запроса для отправки на веб-сервер - когда вы используете escape()
и когда вы используете encodeURI()
или encodeURIComponent()
:
Используйте escape:
escape("% +&=");
ИЛИ
используйте encodeURI () / encodeURIComponent ()
encodeURI("http://www.google.com?var1=value1&var2=value2");
encodeURIComponent("var1=value1&var2=value2");
encodeURIComponent("var1=value1&var2=value2")
это не типичный вариант использования. Этот пример закодирует=
и&
, что, вероятно, не то, что было задумано!encodeURIComponent
обычно применяется отдельно только к значению в каждой паре ключ-значение (часть после каждого=
).var params = encodeURIComponent(key) + '=' + encodeURIComponent(value);
- Может быть, кто-то другой знает лучший способ.Ответы:
побег()
Не используйте это!
escape()
определено в разделе В.2.1.2 побег, а во вводном тексте Приложения В говорится:Поведение:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/escape
Специальные символы кодируются за исключением: @ * _ + -. /
Форма шестнадцатеричное для персонажей, чей код блока значение 0xFF или менее, представляет собой последовательность выхода из двух цифр:
%xx
.Для символов с большей кодовой единицей используется четырехзначный формат
%uxxxx
. Это не разрешено в строке запроса (как определено в RFC3986 ):Знак процента разрешен только в том случае, если за ним сразу следуют две шестнадцатеричные цифры, а после процента
u
не допускается.encodeURI ()
Используйте encodeURI, когда вы хотите рабочий URL. Сделайте этот звонок:
получить:
Не вызывайте encodeURIComponent, поскольку он уничтожит URL и вернет
encodeURIComponent ()
Используйте encodeURIComponent, когда вы хотите закодировать значение параметра URL.
Затем вы можете создать нужный вам URL:
И вы получите этот полный URL:
http://example.net/?param1=http%3A%2F%2Fexample.org%2F%Ffa%3D12%26b%3D55¶m2=99
Обратите внимание, что encodeURIComponent не экранирует
'
символ. Распространенной ошибкой является использование ее для создания атрибутов html, таких какhref='MyUrl'
, что может привести к ошибке внедрения. Если вы строите html из строк, либо используйте"
вместо'
кавычек атрибутов, либо добавьте дополнительный уровень кодирования ('
можно кодировать как% 27).Для получения дополнительной информации об этом типе кодировки вы можете проверить: http://en.wikipedia.org/wiki/Percent-encoding
источник
'
на'
) перед помещением в документ HTML.Разница между
encodeURI()
иencodeURIComponent()
составляет ровно 11 символов, закодированных с помощью encodeURIComponent, но не с помощью encodeURI:Я сгенерировал эту таблицу легко с console.table в Google Chrome с этим кодом:
источник
var arr=[]; for(var i=0;i<256;i++){var char=String.fromCharCode(i); if(encodeURI(char)!==encodeURIComponent(char)) console.log("character: "+char + " | encodeURI: " +encodeURI(char) + " |encodeURIComponent: " + encodeURIComponent(char) ) }
Я нашел эту статью поучительной: Javascript Madness: запрос разбора строк
Я обнаружил это, когда пытался понять, почему decodeURIComponent неправильно декодировал «+». Вот выдержка:
источник
encodeURI
кажется, что это полезно только в довольно неясном случае и действительно не должно существовать. У меня есть некоторые расхождения во мнениях с ним, но я не вижу в этом ничего откровенного или идиотского. Что именно вы считаете ерундой?enctype
АтрибутFORM
элемент определяет тип содержимого , используемый для кодирования набора данных формы для представления на сервер. application / x-www-form-urlencoded Это тип содержимого по умолчанию. Формы, представленные с этим типом содержимого, должны быть закодированы следующим образом: [...] Пробельные символы заменяются на `` + ', а [...] не буквенно-цифровые символы заменяются на `% HH', [...] Ссылка: HTML4 SepcencodeURIComponent не кодирует
-_.!~*'()
, вызывая проблему при публикации данных в php в строке xml.Например:
<xml><text x="100" y="150" value="It's a value with single quote" /> </xml>
Общий побег с
encodeURI
%3Cxml%3E%3Ctext%20x=%22100%22%20y=%22150%22%20value=%22It's%20a%20value%20with%20single%20quote%22%20/%3E%20%3C/xml%3E
Как видите, одинарные кавычки не закодированы. Чтобы решить проблему, я создал две функции для решения проблемы в своем проекте для URL кодирования:
Для декодирования URL:
источник
encodeURI () - функция escape () предназначена для экранирования JavaScript, а не HTTP.
источник
var url = "http://kuler-api.adobe.com/rss/get.cfm?startIndex=0&itemsPerPage=20&timeSpan=0&listType=rating"
... и я хочу получить к нему доступ через API Google Ajax, например, так:var gurl = "http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=?&q=" + url;
... тогда я должен использоватьescape(url)
.encodeURI(url)
не работает с такими параметрами, как кажется.Небольшая таблица сравнения Java против JavaScript против PHP.
источник
Я рекомендую не использовать один из этих методов как есть. Напишите свою собственную функцию, которая делает правильные вещи.
MDN привел хороший пример кодирования URL, показанный ниже.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent
источник
Также помните, что все они кодируют разные наборы символов, и выберите тот, который вам нужен. encodeURI () кодирует меньше символов, чем encodeURIComponent (), который кодирует меньше (и также отличается от точки Дэннипа) символов, чем escape ().
источник
Для целей кодирования javascript предоставил три встроенные функции -
escape()
- не кодирует@*/+
Этот метод считается устаревшим после ECMA 3, поэтому его следует избегать.encodeURI()
- не кодирует~!@#$&*()=:/,;?+'
Предполагается, что URI является полным URI, поэтому не кодирует зарезервированные символы, которые имеют особое значение в URI. Этот метод используется, когда целью является преобразование полного URL-адреса вместо какого-либо специального сегмента URL-адреса. Пример -encodeURI('http://stackoverflow.com');
даст - http://stackoverflow.comencodeURIComponent()
- не кодирует- _ . ! ~ * ' ( )
Эта функция кодирует компонент универсального идентификатора ресурса (URI), заменяя каждый экземпляр определенных символов одной, двумя, тремя или четырьмя escape-последовательностями, представляющими кодировку символа UTF-8. Этот метод должен использоваться для преобразования компонента URL. Например, необходимоencodeURIComponent('http://stackoverflow.com');
добавить некоторый пользовательский ввод. Пример - даст - http% 3A% 2F% 2Fstackoverflow.comВсе это кодирование выполняется в UTF 8, т.е. символы будут преобразованы в формат UTF-8.
encodeURIComponent отличается от encodeURI тем, что он кодирует зарезервированные символы и номер знака # encodeURI.
источник
Я обнаружил, что экспериментирование с различными методами является хорошей проверкой работоспособности, даже после того, как они хорошо разбираются в их различных применениях и возможностях.
С этой целью я счел этот сайт чрезвычайно полезным, чтобы подтвердить мои подозрения, что я что-то делаю надлежащим образом. Это также оказалось полезным для декодирования строки encodeURIComponent, которую может быть довольно сложно интерпретировать. Отличная закладка для:
http://www.the-art-of-web.com/javascript/escape/
источник
Принятый ответ хорош. Чтобы продлить на последнюю часть:
Если вы хотите быть в безопасности, процент кодирования незарезервированных символов должно быть закодировано.
Вы можете использовать этот метод, чтобы избежать их (источник Mozilla )
источник
Современное переписывание ответа @ johann-echavarria:
Или, если вы можете использовать таблицу, замените
console.log
наconsole.table
(для более красивого вывода).источник
Вдохновленный столом Иоганна , я решил расширить стол. Я хотел посмотреть, какие символы ASCII кодируются.
Показать фрагмент кода
Таблица показывает только закодированные символы. Пустые ячейки означают, что исходные и закодированные символы совпадают.
Просто чтобы быть лишним, я добавляю еще одну таблицу для
urlencode()
противrawurlencode()
. Кажется, единственная разница заключается в кодировке пробела.источник
У меня есть эта функция ...
источник
encodeURI
не существует, ноescape
существует.