1505 Stimmen

Wann sollten Sie Escape anstelle von encodeURI / encodeURIComponent verwenden?

Bei der Kodierung einer an einen Webserver zu sendenden Abfragezeichenfolge - wann verwenden Sie escape() und wann verwenden Sie encodeURI() o encodeURIComponent() :

Escape verwenden:

escape("% +&=");

OR

encodeURI() / encodeURIComponent() verwenden

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

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

135 Stimmen

Es ist erwähnenswert, dass encodeURIComponent("var1=value1&var2=value2") es no der typische Anwendungsfall. Dieses Beispiel kodiert die = et & was wahrscheinlich nicht beabsichtigt war! encodeURIComponent wird in der Regel nur auf den Wert in jedem Schlüssel-Wert-Paar angewendet (der Teil nach jedem = ).

3 Stimmen

Müssen Sie irgendetwas an dem Schlüssel machen? Was ist, wenn er ein = enthält? (Ist das überhaupt möglich?)

3 Stimmen

@Mala Ich bin noch neu in der Web-Programmierung im Allgemeinen, aber was ich in meiner begrenzten Erfahrung verwendet habe, ist, den Schlüssel und den Wert getrennt zu kodieren, um sicherzustellen, dass das "=" bleibt: var params = encodeURIComponent(key) + '=' + encodeURIComponent(value); - Vielleicht weiß jemand anders einen besseren Weg.

14voto

Jerry Joseph Punkte 932

Ich empfehle, eine dieser Methoden nicht zu verwenden. Schreiben Sie Ihre eigene Funktion, die das Richtige tut.

MDN hat ein gutes Beispiel für die Kodierung von URLs gegeben (siehe unten).

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

1 Stimmen

Was für eine großartige Antwort (wenn sie mit Chrome Edge und Firefox kompatibel ist und keine Fehler macht)

13voto

Gaurav Tiwari Punkte 673

Zum Zweck der Kodierung hat Javascript drei eingebaute Funktionen bereitgestellt -

  1. escape() - verschlüsselt nicht @*/+ Diese Methode ist nach der ECMA 3 veraltet und sollte daher vermieden werden.

  2. encodeURI() - verschlüsselt nicht ~!@#$&*()=:/,;?+' Sie geht davon aus, dass der URI ein vollständiger URI ist und kodiert daher keine reservierten Zeichen, die im URI eine besondere Bedeutung haben. Diese Methode wird verwendet, wenn die Absicht besteht, die vollständige URL zu konvertieren und nicht ein spezielles Segment der URL. Beispiel. encodeURI('http://stackoverflow.com'); gibt - http://stackoverflow.com

  3. encodeURIComponent() - verschlüsselt nicht - _ . ! ~ * ' ( ) Diese Funktion kodiert eine URI-Komponente (Uniform Resource Identifier), indem jede Instanz bestimmter Zeichen durch eine, zwei, drei oder vier Escape-Sequenzen ersetzt wird, die die UTF-8-Kodierung des Zeichens darstellen. Diese Methode sollte verwendet werden, um eine Komponente der URL zu konvertieren. Zum Beispiel müssen einige Benutzereingaben angehängt werden Beispiel. encodeURIComponent('http://stackoverflow.com'); wird geben - http%3A%2F%2Fstackoverflow.com

Die gesamte Kodierung erfolgt in UTF 8, d. h. die Zeichen werden in das UTF-8-Format umgewandelt.

encodeURIComponent unterscheidet sich von encodeURI dadurch, dass es reservierte Zeichen und das Nummernzeichen # von encodeURI kodiert

10voto

Pseudo Masochist Punkte 1899

Denken Sie auch daran, dass sie alle unterschiedliche Zeichensätze kodieren, und wählen Sie denjenigen aus, den Sie benötigen. encodeURI() kodiert weniger Zeichen als encodeURIComponent(), das weniger (und auch andere, um es mit Dannyp zu sagen) Zeichen kodiert als escape().

5voto

akinuri Punkte 9029

Inspiriert durch Johanns Tisch habe ich beschlossen, die Tabelle zu erweitern. Ich wollte sehen, welche ASCII-Zeichen kodiert werden.

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);

Die Tabelle zeigt nur die kodierten Zeichen. Leere Zellen bedeuten, dass das Original und die kodierten Zeichen identisch sind.


Nur um sicherzugehen, füge ich eine weitere Tabelle für urlencode() gegen rawurlencode() . Der einzige Unterschied scheint die Kodierung des Leerzeichens zu sein.

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>

4voto

veeTrain Punkte 2883

Ich habe festgestellt, dass das Experimentieren mit den verschiedenen Methoden eine gute Überprüfung ist, selbst wenn man die verschiedenen Einsatzmöglichkeiten und Fähigkeiten gut kennt.

Zu diesem Zweck habe ich Folgendes gefunden diese Website sehr nützlich, um meinen Verdacht zu bestätigen, dass ich etwas Richtiges tue. Es hat sich auch als nützlich erwiesen, um eine encodeURIComponent-Zeichenkette zu dekodieren, die ziemlich schwierig zu interpretieren sein kann. Ein großartiges Lesezeichen, das man haben sollte:

http://www.the-art-of-web.com/javascript/escape/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X