Когда вы должны использовать escape вместо encodeURI / encodeURIComponent?
при кодировании строки запроса для отправки на веб-сервер-когда вы используете escape() и когда вы используете encodeURI() или encodeURIComponent():
использование:
escape("% +&=");
или
используйте encodeURI () / encodeURIComponent ()
encodeURI("http://www.google.com?var1=value1&var2=value2");
encodeURIComponent("var1=value1&var2=value2");
13 ответов:
escape ()
не используйте его!
escape()определен в разделе Б. 2.1.2 Побег и вводный текст приложения в говорит:... Все языковые особенности и поведение, указанные в настоящем приложении, имеют одну или несколько нежелательных характеристик и в отсутствие устаревшего использования будут удалены из этой спецификации. ...
... Программисты не должны использовать или предполагать существование этих функций и поведение при написании нового кода ECMAScript....поведение:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/escape
специальные символы кодируются за исключением: @*_+-./
шестнадцатеричная форма для символов, значение единицы кода которых равно 0xFF или меньше, представляет собой двузначную escape-последовательность:
%xx.для символов с большей кодовой единицей, четырехзначный формат это. Это не допускается в строке запроса (как определено в RFC3986):
query = *( pchar / "/" / "?" ) pchar = unreserved / pct-encoded / sub-delims / ":" / "@" unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" pct-encoded = "%" HEXDIG HEXDIG sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="знак процента допускается только в том случае, если за ним непосредственно следуют два шестнадцатеричных числа, за процентом следует
uне допускается.encodeURI()
используйте encodeURI, когда вы хотите рабочий URL. Сделайте этот звонок:
encodeURI("http://www.example.org/a file with spaces.html")для:
http://www.example.org/a%20file%20with%20spaces.htmlне вызывайте encodeURIComponent, так как это уничтожит URL-адрес и возвращает
http%3A%2F%2Fwww.example.org%2Fa%20file%20with%20spaces.htmlencodeURIComponent()
используйте encodeURIComponent, если вы хотите закодировать значение параметра URL.
var p1 = encodeURIComponent("http://example.org/?a=12&b=55")затем вы можете создать URL вам нужно:
var url = "http://example.net/?param1=" + p1 + "¶m2=99";и вы получите этот полный 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
разницу между
encodeURI()иencodeURIComponent()ровно 11 символов, закодированных encodeURIComponent, но не encodeURI:
я сгенерировал эту таблицу легко с
Я нашел эту статью поучительно : JavaScript Madness: Синтаксический Анализ Строки Запроса
Я нашел его, когда пытался понять, почему decodeURIComponent не декодировал " + " правильно. Вот выдержка:
String: "A + B" Expected Query String Encoding: "A+%2B+B" escape("A + B") = "A%20+%20B" Wrong! encodeURI("A + B") = "A%20+%20B" Wrong! encodeURIComponent("A + B") = "A%20%2B%20B" Acceptable, but strange Encoded String: "A+%2B+B" Expected Decoding: "A + B" unescape("A+%2B+B") = "A+++B" Wrong! decodeURI("A+%2B+B") = "A+++B" Wrong! decodeURIComponent("A+%2B+B") = "A+++B" Wrong!
encodeURIComponent не кодирует
-_.!~*'(), вызывая проблемы при публикации данных на 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:
function encodeData(s:String):String{ return encodeURIComponent(s).replace(/\-/g, "%2D").replace(/\_/g, "%5F").replace(/\./g, "%2E").replace(/\!/g, "%21").replace(/\~/g, "%7E").replace(/\*/g, "%2A").replace(/\'/g, "%27").replace(/\(/g, "%28").replace(/\)/g, "%29"); }для декодирования URL:
function decodeData(s:String):String{ try{ return decodeURIComponent(s.replace(/\%2D/g, "-").replace(/\%5F/g, "_").replace(/\%2E/g, ".").replace(/\%21/g, "!").replace(/\%7E/g, "~").replace(/\%2A/g, "*").replace(/\%27/g, "'").replace(/\%28/g, "(").replace(/\%29/g, ")")); }catch (e:Error) { } return ""; }
небольшая таблица сравнения Ява и яваскрипт и РНР.
1. Java URLEncoder.encode (using UTF8 charset) 2. JavaScript encodeURIComponent 3. JavaScript escape 4. PHP urlencode 5. PHP rawurlencode char JAVA JavaScript --PHP--- [ ] + %20 %20 + %20 [!] %21 ! %21 %21 %21 [*] * * * %2A %2A ['] %27 ' %27 %27 %27 [(] %28 ( %28 %28 %28 [)] %29 ) %29 %29 %29 [;] %3B %3B %3B %3B %3B [:] %3A %3A %3A %3A %3A [@] %40 %40 @ %40 %40 [&] %26 %26 %26 %26 %26 [=] %3D %3D %3D %3D %3D [+] %2B %2B + %2B %2B [$] %24 %24 %24 %24 %24 [,] %2C %2C %2C %2C %2C [/] %2F %2F / %2F %2F [?] %3F %3F %3F %3F %3F [#] %23 %23 %23 %23 %23 [[] %5B %5B %5B %5B %5B []] %5D %5D %5D %5D %5D ---------------------------------------- [~] %7E ~ %7E %7E ~ [-] - - - - - [_] _ _ _ _ _ [%] %25 %25 %25 %25 %25 [\] %5C %5C %5C %5C %5C ---------------------------------------- char -JAVA- --JavaScript-- -----PHP------ [ä] %C3%A4 %C3%A4 %E4 %C3%A4 %C3%A4 [ф] %D1%84 %D1%84 %u0444 %D1%84 %D1%84
также помните, что все они кодируют различные наборы символов, и выберите тот, который вам нужно соответствующим образом. encodeURI () кодирует меньше символов, чем encodeURIComponent (), который кодирует меньше (а также отличается от точки dannyp) символов, чем escape ().
Я не рекомендую использовать один из этих методов как. Написать собственную функцию, которая делает правильные вещи.
MDN дал хороший пример кодирования url, показанный ниже.
var fileName = 'my file(2).txt'; var header = "Content-Disposition: attachment; filename*=UTF-8''" + encodeRFC5987ValueChars(fileName); console.log(header); // logs "Content-Disposition: attachment; filename*=UTF-8''my%20file%282%29.txt" function encodeRFC5987ValueChars (str) { return encodeURIComponent(str). // Note that although RFC3986 reserves "!", RFC5987 does not, // so we do not need to escape it replace(/['()]/g, escape). // i.e., %27 %28 %29 replace(/\*/g, '%2A'). // The following are not required for percent-encoding per RFC5987, // so we can allow for a little better readability over the wire: |`^ replace(/%(?:7C|60|5E)/g, unescape); }https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent
С целью кодирования javascript дал три встроенные функции -
escape () - не кодирует
@*/+Этот метод устарел после ECMA 3, поэтому его следует избегать.encodeURI() - не кодируют
~!@#$&*()=:/,;?+'Он предполагает, что URI является полным URI, поэтому не кодирует зарезервированные символы, которые имеют особое значение в URI. Этот метод используется, когда цель состоит в том, чтобы преобразовать полный URL вместо некоторых специальный сегмент URL. Пример -encodeURI('http://stackoverflow.com');даст -http://stackoverflow.comencodeURIComponent () - не кодирует
- _ . ! ~ * ' ( )Эта функция кодирует компонент Uniform Resource Identifier (URI) путем замены каждого экземпляра определенных символов одной, двумя, тремя или четырьмя escape-последовательностями, представляющими кодировку символа UTF-8. Этот метод следует использовать для преобразования компонента URL. Например, некоторые пользовательские данные должны быть приложенный Пример -encodeURI('http://stackoverflow.com');даст - http%3A%2F%2Fstackoverflow.comвся эта кодировка выполняется в UTF 8 т. е. символы будут преобразованы в формат UTF-8.
encodeURIComponent отличается от encodeURI тем, что он кодирует зарезервированные символы и числовой знак # of encodeURI
Я обнаружил, что эксперименты с различными методами-это хорошая проверка здравомыслия даже после того, как они хорошо справляются с тем, что их различные виды использования и возможности.
к этому концу я нашел этот сайт крайне полезно, чтобы подтвердить мои подозрения, что я делаю что-то правильно. Она также доказала свою полезность для декодирование encodeURIComponent объед строку, которая может быть довольно сложным для интерпретации. Отличная закладка для есть:
У меня есть эта функция...
var escapeURIparam = function(url) { if (encodeURIComponent) url = encodeURIComponent(url); else if (encodeURI) url = encodeURI(url); else url = escape(url); url = url.replace(/\+/g, '%2B'); // Force the replacement of "+" return url; };
принятый ответ хорош. Чтобы продолжить на последней части:
обратите внимание, что encodeURIComponent не экранирует символ'. Обычное явление ошибка заключается в том, чтобы использовать его для создания атрибутов html, таких как href='MyUrl', которые может пострадать ошибка инъекции. Если вы создаете html из строки, либо использовать "вместо' для кавычек атрибутов, либо добавить дополнительный уровень кодирования (может быть закодирован как %27).
Если вы хотите быть на безопасной стороне, процент кодирования незащищенных символов также должны быть закодированы.
вы можете использовать этот метод, чтобы избежать их (источник Mozilla)
function fixedEncodeURIComponent(str) { return encodeURIComponent(str).replace(/[!'()*]/g, function(c) { return '%' + c.charCodeAt(0).toString(16); }); } // fixedEncodeURIComponent("'") --> "%27"
современная переписанный @Йохан-смотрите игру echavarria это:
console.log( Array(256) .fill() .map((ignore, i) => String.fromCharCode(i)) .filter( (char) => encodeURI(char) !== encodeURIComponent(char) ? { character: char, encodeURI: encodeURI(char), encodeURIComponent: encodeURIComponent(char) } : false ) )или если вы можете использовать таблицу, заменить
console.logСconsole.table(для более красивого выхода).

Comments