Когда вы должны использовать escape вместо encodeURI / encodeURIComponent? - PullRequest
1342 голосов
/ 16 сентября 2008

При кодировании строки запроса для отправки на веб-сервер - когда вы используете escape() и когда вы используете encodeURI() или encodeURIComponent():

Использовать escape:

escape("% +&=");

OR

использовать encodeURI () / encodeURIComponent ()

encodeURI("http://www.google.com?var1=value1&var2=value2");

encodeURIComponent("var1=value1&var2=value2");

Ответы [ 14 ]

2 голосов
/ 11 февраля 2019

Вдохновленный таблицей Иоганна , я решил расширить таблицу. Я хотел посмотреть, какие символы ASCII кодируются.

screenshot of console.table

var ascii = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";

var encoded = [];

ascii.split("").forEach(function (char) {
    var obj = { char };
    if (char != encodeURI(char))
        obj.encodeURI = encodeURI(char);
    if (char != encodeURIComponent(char))
        obj.encodeURIComponent = encodeURIComponent(char);
    if (obj.encodeURI || obj.encodeURIComponent)
        encoded.push(obj);
});

console.table(encoded);

В таблице указаны только закодированные символы. Пустые ячейки означают, что исходные и закодированные символы совпадают.


Просто чтобы добавить, я добавляю еще одну таблицу для urlencode() против rawurlencode(). Кажется, единственная разница заключается в кодировке пробела.

screenshot of console.table

<script>
<?php
$ascii = str_split(" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~", 1);
$encoded = [];
foreach ($ascii as $char) {
    $obj = ["char" => $char];
    if ($char != urlencode($char))
        $obj["urlencode"] = urlencode($char);
    if ($char != rawurlencode($char))
        $obj["rawurlencode"] = rawurlencode($char);
    if (isset($obj["rawurlencode"]) || isset($obj["rawurlencode"]))
        $encoded[] = $obj;
}
echo "var encoded = " . json_encode($encoded) . ";";
?>
console.table(encoded);
</script>
1 голос
/ 09 февраля 2018

Современное переписывание ответа @ johann-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 (для более симпатичного вывода).

1 голос
/ 27 сентября 2017

Принятый ответ - это хорошо. Чтобы продлить на последнюю часть:

Обратите внимание, что 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"
1 голос
/ 21 июня 2013

У меня есть эта функция ...

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;
};
...