Frage Wann soll man escape anstelle von encodeURI / encodeURIComponent verwenden?


Wenn Sie eine Abfragezeichenfolge verschlüsseln, die an einen Webserver gesendet werden soll - wann verwenden Sie? escape() und wann benutzt du? encodeURI() oder encodeURIComponent():

Benutze escape:

escape("% +&=");

ODER

benutze encodeURI () / encodeURIComponent ()

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

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

1283
2017-09-16 19:24


Ursprung


Antworten:


Flucht()

Benutze es nicht! escape() ist im Abschnitt definiert B.2.1.2 Flucht und das Einleitungstext von Anhang B sagt:

... Alle Sprachmerkmale und Verhaltensweisen, die in diesem Anhang aufgeführt sind, weisen eine oder mehrere unerwünschte Eigenschaften auf und würden bei fehlender Legacy-Nutzung aus dieser Spezifikation entfernt. ...
  ... Programmierer sollten beim Erstellen eines neuen ECMAScript-Codes nicht davon ausgehen, dass diese Features und Verhaltensweisen vorhanden sind ....

Verhalten:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/escape

Sonderzeichen sind codiert mit Ausnahme von: @ * _ + -. /

Die hexadezimale Form für Zeichen, deren Code-Einheit-Wert 0xFF oder weniger ist, ist eine zweistellige Escape-Sequenz: %xx.

Für Zeichen mit einer größeren Code-Einheit das vierstellige Format %uxxxx wird eingesetzt. Dies ist in einer Abfragezeichenfolge (wie in. Definiert) nicht zulässig RFC3986):

query       = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

Ein Prozentzeichen ist nur erlaubt, wenn direkt zwei Hexzi- ge folgen, Prozent gefolgt von u ist nicht erlaubt.

encodeURI ()

Verwenden Sie encodeURI, wenn Sie eine funktionierende URL möchten. Mach diesen Anruf:

encodeURI("http://www.example.org/a file with spaces.html")

bekommen:

http://www.example.org/a%20file%20with%20spaces.html

Rufen Sie nicht encodeURIComponent auf, da dies die URL zerstören und zurückgeben würde

http%3A%2F%2Fwww.example.org%2Fa%20file%20with%20spaces.html

encodeURIComponent ()

Verwenden Sie encodeURIComponent, wenn Sie den Wert eines URL-Parameters codieren möchten.

var p1 = encodeURIComponent("http://example.org/?a=12&b=55")

Dann können Sie die URL erstellen, die Sie benötigen:

var url = "http://example.net/?param1=" + p1 + "&param2=99";

Und Sie erhalten diese vollständige URL:

http://example.net/?param1=http%3A%2F%2Fexample.org%2F%Ffa%3D12%26b%3D55&param2=99

Beachten Sie, dass encodeURIComponent nicht aus dem Code entfernt wird ' Charakter. Ein häufiger Fehler ist es, HTML-Attribute wie z href='MyUrl', die einen Injektionsfehler erleiden könnte. Wenn Sie HTML aus Strings konstruieren, verwenden Sie entweder " Anstatt von ' für Attribut-Anführungszeichen, oder fügen Sie eine zusätzliche Ebene der Codierung (' kann als% 27 kodiert werden).

Weitere Informationen zu diesem Codierungstyp finden Sie unter: http://en.wikipedia.org/wiki/Percent-encoding


1813
2018-05-24 06:54



Der Unterschied zwischen encodeURI() und encodeURIComponent() sind genau 11 Zeichen codiert von encodeURIComponent, aber nicht von encodeURI:

Table with the ten differences between encodeURI and encodeURIComponent

Ich habe diesen Tisch einfach mit erstellt Konsole.Tabelle in Google Chrome mit diesem Code:

var arr = [];
for(var i=0;i<256;i++) {
  var char=String.fromCharCode(i);
  if(encodeURI(char)!==encodeURIComponent(char)) {
    arr.push({
      character:char,
      encodeURI:encodeURI(char),
      encodeURIComponent:encodeURIComponent(char)
    });
  }
}
console.table(arr);


390
2017-10-09 09:26



Ich fand diesen Artikel aufschlussreich: Javascript Madness: Abfrage String Parsing

Ich habe es gefunden, als ich versuchte zu verstehen, warum decodeURIComponent '+' nicht richtig dekodierte. Hier ist ein Auszug:

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!

43
2018-05-08 07:51



encodeURIComponent wird nicht codiert -_.!~*'(), verursacht Problem beim Veröffentlichen von Daten in XML-Zeichenfolge.

Beispielsweise:
<xml><text x="100" y="150" value="It's a value with single quote" /> </xml>

Allgemeine Flucht mit 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

Sie können sehen, Single-Anführungszeichen ist nicht codiert. Um das Problem zu lösen, habe ich zwei Funktionen erstellt, um das Problem in meinem Projekt zu beheben: Encoding 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");
}

Für die Dekodierung der 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 "";
}

37
2017-09-16 19:26



encodeURI () - Die escape () -Funktion ist für Javascript-Escaping, nicht HTTP.


36
2017-10-08 15:20



Kleine Vergleichstabelle Java vs. JavaScript vs. PHP.

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

14
2017-09-16 19:40



Denken Sie auch daran, dass sie alle unterschiedliche Zeichensätze codieren, und wählen Sie die passende aus. encodeURI () kodiert weniger Zeichen als encodeURIComponent (), das weniger (und auch andere, alsnyp's point) Zeichen codiert als escape ().


10
2018-04-23 16:54



Ich empfehle, keine dieser Methoden zu verwenden. Schreibe deine eigene Funktion, die das Richtige tut.

MDN hat ein gutes Beispiel für die unten gezeigte URL-Codierung gegeben.

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


9
2018-04-21 07:55