Frage

Wenn Sie eine Abfrage-String codiert, an einen Webserver gesendet werden - wenn verwenden Sie escape() und wann verwenden Sie encodeURI() oder encodeURIComponent():

Verwenden Flucht:

escape("% +&=");

oder

verwenden encodeURI () / encodeURIComponent ()

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

encodeURIComponent("var1=value1&var2=value2");
War es hilfreich?

Lösung

escape ()

Verwenden Sie es nicht! escape() ist im Abschnitt B.2.1.2 Flucht definiert und die Einführung Text des Anhangs B sagt:

  

... Alle der Sprachfunktionen und Verhaltensweisen in diesem Anhang angegeben haben eine oder mehr unerwünschten Eigenschaften und in Abwesenheit von Legacy-Nutzung würde aus dieser Beschreibung entfernt werden. ...
  ... Programmierer sollen nicht die Existenz dieser Merkmale und Verhaltensweisen verwenden oder annehmen, wenn neuen ECMAScript Code zu schreiben ....

Verhalten:

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

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

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

Für Zeichen mit einer größeren Codeeinheit, die vierstellige Format %uxxxx verwendet wird. Dies ist nicht in einem Abfrage-String erlaubt (wie in RFC3986 definiert):

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

Ein Prozentzeichen ist nur dann erlaubt, wenn sie direkt von zwei hexdigits folgt Prozent u gefolgt ist nicht erlaubt.

encodeURI ()

Verwenden encodeURI wenn Sie eine gültige URL. Machen Sie diesen Aufruf:

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

zu bekommen:

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

Sie nennen encodeURIComponent nicht, da es die URL zerstören würde und zurück

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

encodeURIComponent ()

Verwenden encodeURIComponent, wenn Sie den Wert eines URL-Parameter kodieren.

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

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

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

Und Sie werden diese vollständige URL erhalten:

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

Beachten Sie, dass encodeURIComponent nicht die ' Zeichen nicht entkommen. Ein gemeinsamer Fehler ist, es zu benutzen html Attribute wie href='MyUrl' zu schaffen, die eine Injektion Fehler leiden könnte. Wenn Sie HTML aus Strings bauen, entweder " anstelle von ' für Attribut Anführungszeichen oder eine zusätzliche Schicht von Codierung hinzufügen (' als% 27 codiert werden).

Für weitere Informationen über diese Art der Codierung Sie überprüfen können: http: //en.wikipedia. org / wiki / Prozent-Codierung

Andere Tipps

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

Tabelle mit den zehn Unterschieden zwischen encodeURI und encodeURIComponent

I erzeugen diese Tabelle einfach mit console.table 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);

Ich habe diesen Artikel erhellend: Javascript Madness: Abfrage String Parsing

ich es gefunden, als ich versuchte zu under warum decodeURIComponent nicht wurde Decodierung ‚+‘ richtig. Hier 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!

encodeURIComponent nicht -_.!~*'() kodieren, so dass Problemdaten in der Veröffentlichung in XML-String in PHP.

Zum Beispiel:
<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 sehen können, ist Apostroph nicht codiert. Zu beheben Problem habe ich zwei Funktionen Problem in meinem Projekt zu lösen, für 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 Dekodierung 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 "";
}

encodeURI (.) - die escape () Funktion ist für javascript escaping, nicht HTTP

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

Ich empfehle nicht einer dieser Methoden zu verwenden, wie es ist. Schreiben Sie Ihre eigene Funktion, die das Richtige tut.

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

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

Denken Sie auch daran, dass sie alle verschiedene Sätze von Zeichen kodieren, und wählen Sie den in geeigneter Weise benötigen. encodeURI () kodiert weniger Zeichen als encodeURIComponent (), die weniger (und auch andere, zu dannyp des Punkt) Zeichen als Escape-codiert ().

Für die Zwecke der Codierung JavaScript drei eingebaute Funktionen gegeben hat -

  1. escape () - kodiert nicht @*/+ Diese Methode ist veraltet, nachdem der ECMA 3, so sollte es vermieden werden.

  2. encodeURI () - kodiert nicht ~!@#$&*()=:/,;?+' Er geht davon aus, dass der URI eine vollständige URI ist, so nicht reservierte Zeichen kodieren, die eine besondere Bedeutung in der URI haben. Diese Methode wird verwendet, wenn die Absicht ist, die vollständige URL statt einig spezielles Segment der URL zu konvertieren. Beispiel - encodeURI('http://stackoverflow.com'); geben - http://stackoverflow.com

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

All diese Codierung in UTF-8 heißt die Zeichen durchgeführt wird, wird in UTF-8-Format konvertiert werden.

encodeURIComponent unterscheiden sich von encodeURI dass es kodieren reservierte Zeichen und Nummernzeichen # von encodeURI

Ich habe, dass eine gute mit den verschiedenen Methoden experimentiert gefunden ist Plausibilitätsprüfung auch nach einem guten Griff zu haben, was ihre verschiedenen Verwendungen und Fähigkeiten sind.

Auf dem Weg zu diesem Zweck habe ich diese Website äußerst nützlich bestätigen meinen Verdacht, dass ich etwas in geeigneter Weise tue. Es hat sich auch zum Dekodieren eines encodeURIComponent'ed String als nützlich erwiesen, die ziemlich schwierig sein kann zu interpretieren. Ein großes Lesezeichen zu haben:

http://www.the-art-of-web.com / JavaScript / Flucht /

Inspiriert von Johanns Tabelle , habe ich beschlossen, um die Tabelle zu erweitern. Ich wollte sehen, welche ASCII-Zeichen codiert erhalten.

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

Tabelle zeigt nur die codierten Zeichen. Leere Zellen bedeuten, dass die ursprüngliche und die codierten Zeichen gleich sind.


Just Extra zu sein, ich bin eine andere Tabelle um für urlencode() vs rawurlencode() . Der einzige Unterschied scheint die Codierung von Leerzeichen zu sein.

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

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

Die akzeptierte Antwort ist gut. Zur Erweiterung auf dem letzten Teil:

  

Beachten Sie, dass encodeURIComponent nicht den "Charakter nicht entkommen. Ein gemeinsames   bug ist, es zu verwenden, um HTML Attribute wie href = ‚myURL‘ zu schaffen, die   könnte eine Injektion Fehler leiden. Wenn Sie bauen html aus   Strings, entweder "statt" für Attribut Anführungszeichen verwenden oder ein hinzufügen   Extraschicht-Codierung (‘kann als 27% codiert werden).

Wenn Sie auf der sicheren Seite sein, Prozent Codierung nicht reservierte Zeichen sollte auch verschlüsselt werden.

Sie können diese Methode verwenden, um sie (Quelle zu entkommen Mozilla )

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

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

Moderne neu zu schreiben @ johann-Echavarria 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 console.log mit console.table (für die schönere Ausgabe).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top