online - javascript urlencode json




Wann soll man escape anstelle von encodeURI/encodeURIComponent verwenden? (9)

Wenn Sie eine Abfragezeichenfolge zum Senden an einen Webserver encodeURI() - wann verwenden Sie escape() und wann verwenden Sie encodeURI() oder encodeURIComponent() :

Benutze escape:

escape("% +&=");

ODER

benutze encodeURI () / encodeURIComponent ()

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

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

Flucht()

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. Bei Zeichen mit einer größeren Code-Einheit wird das vierstellige Format% uxxxx verwendet.

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

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 das ' Zeichen ausgibt. Ein häufiger Fehler besteht darin, HTML-Attribute wie href='MyUrl' zu erstellen, die einen Fehler in der Injektion verursachen könnten. Wenn Sie HTML aus Zeichenfolgen konstruieren, verwenden Sie entweder " statt ' für Attribut-Anführungszeichen oder fügen Sie eine zusätzliche Kodierungsschicht hinzu ( ' kann als% 27 kodiert werden).

Weitere Informationen zu dieser Art der Codierung finden Sie unter http://en.wikipedia.org/wiki/Percent-encoding


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 ().


Die angenommene Antwort ist gut. Um auf den letzten Teil zu erweitern:

Beachten Sie, dass encodeURIComponent nicht das 'Zeichen ausgibt. Ein häufiger Fehler besteht darin, HTML-Attribute wie href = 'MyUrl' zu erstellen, die einen Fehler in der Injektion verursachen könnten. Wenn Sie HTML aus Zeichenfolgen konstruieren, verwenden Sie entweder "statt" für Attribut-Anführungszeichen oder fügen Sie eine zusätzliche Kodierungsschicht hinzu ('kann als% 27 kodiert werden).

Wenn Sie auf der sicheren Seite sein wollen, sollte der Prozentsatz, der nicht reservierte Zeichen codiert, ebenfalls codiert werden.

Sie können diese Methode verwenden, um sie zu umgehen (Quelle https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent )

function fixedEncodeURIComponent(str) {
  return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
    return '%' + c.charCodeAt(0).toString(16);
  });
}

// fixedEncodeURIComponent("'") --> "%27"

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


Ich habe diese Funktion ...

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

Ich habe festgestellt, dass das Experimentieren mit den verschiedenen Methoden eine gute Plausibilitätsprüfung ist, selbst nachdem man die verschiedenen Verwendungsmöglichkeiten und Fähigkeiten gut verstanden hat.

Zu diesem Zweck habe ich festgestellt, dass the-art-of-web.com/javascript/escape äußerst nützlich ist, um meinen Verdacht zu bestätigen, dass ich etwas richtig mache. Es hat sich auch als nützlich für die Decodierung einer encodeURIComponent'ed-Zeichenfolge erwiesen, die ziemlich schwierig zu interpretieren sein kann. Ein tolles Lesezeichen zu haben:

the-art-of-web.com/javascript/escape


Moderne Umschrift von @ johann-echavarrias Antwort:

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

Oder, wenn Sie eine Tabelle verwenden können, ersetzen Sie console.log durch console.table (für die hübschere Ausgabe).


Zum Zweck der Codierung hat Javascript drei eingebaute Funktionen gegeben -

  1. escape () - codiert nicht @*/+ Diese Methode ist nach der ECMA 3 veraltet, daher sollte sie vermieden werden.

  2. encodeURI () - codiert nicht [email protected]#$&*()=:/,;?+' Es wird davon ausgegangen, dass der URI ein vollständiger URI ist. Daher werden reservierte Zeichen, die im URI eine besondere Bedeutung haben, nicht codiert. Diese Methode wird verwendet, wenn die vollständige URL anstelle eines speziellen URL-Segments konvertiert werden soll. Beispiel - encodeURI('http://.com'); wird geben - http://.com

  3. encodeURIComponent () - codiert 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-Codierung des Zeichens darstellen. Diese Methode sollte verwendet werden, um eine Komponente der URL zu konvertieren. Zum Beispiel müssen einige Benutzereingaben angefügt werden. Beispiel - encodeURI('http://.com'); wird geben - http% 3A% 2F% 2F.com

All diese Codierung wird in UTF 8 durchgeführt, dh die Zeichen werden im UTF-8-Format konvertiert.

encodeURIComponent unterscheidet sich von encodeURI dadurch, dass reservierte Zeichen und das Nummernzeichen # von encodeURI codiert werden


encodeURIComponent codiert nicht -_.!~*'() , was zu Problemen beim Veröffentlichen von Daten in XML-Zeichenfolge führt.

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

Allgemeine Escape 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 beheben, 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 "";
}




query-string