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.

489voto

Johann Echavarria Punkte 9215

Der Unterschied zwischen encodeURI() y encodeURIComponent() sind genau 11 Zeichen, die von encodeURIComponent, aber nicht von encodeURI kodiert werden:

Table with the ten differences between encodeURI and encodeURIComponent

Ich habe diese Tabelle einfach mit 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);

0 Stimmen

Ist das nicht browserabhängig?

6 Stimmen

@bladnman encodeURI und encodeURIComponent sollten auf diese Weise in allen gängigen Browsern funktionieren. Sie können den obigen Code in Chrome und Firefox testen, da beide die console.table unterstützen. In anderen Browsern (einschließlich Firefox und Chrome) können Sie den folgenden Code verwenden: var arr=[]; for(var i=0;i<256;i++){var char=String.fromCharCode(i); if(encodeURI(char)!==encodeURIComponent(char)) console.log("character: "+char + " | encodeURI: " +encodeURI(char) + " |encodeURIComponent: " + encodeURIComponent(char) ) }

0 Stimmen

@Pacerier sollte in verschiedenen Browsern identisch sein, es sei denn, die ursprüngliche Spezifikation ist zu zweideutig... siehe auch stackoverflow.com/questions/4407599/

49voto

Damien Punkte 2852

Ich fand diesen Artikel erhellend: Javascript-Wahnsinn: Query String Parsing

Ich habe es gefunden, als ich versuchte zu verstehen, warum decodeURIComponent das '+' nicht korrekt dekodiert. 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!

12 Stimmen

Der Artikel, auf den Sie verweisen, enthält eine Menge Unfug. Es scheint mir, dass der Autor selbst nicht verstanden hat, wofür die Funktionen eigentlich verwendet werden...

3 Stimmen

@Christoph Für mich sieht das alles vernünftig aus. Insbesondere stimme ich mit ihm überein, dass encodeURI scheint nur in einem ziemlich obskuren Grenzfall nützlich zu sein und muss eigentlich nicht existieren. Ich habe einige Meinungsverschiedenheiten mit ihm, aber ich sehe darin nichts völlig Falsches oder Idiotisches. Was genau halten Sie für Unsinn?

1 Stimmen

El enctype Attribut des FORM Element gibt den Inhaltstyp an, der verwendet wird, um den Formulardatensatz für die Übermittlung an den Server zu kodieren. anwendung/x-www-form-urlencoded Dies ist der Standard-Inhaltstyp. Formulare, die mit diesem Inhaltstyp eingereicht werden, müssen wie folgt kodiert sein: [...] Leerzeichen werden durch ``+' ersetzt, und [...] Nicht-alphanumerische Zeichen werden durch `%HH' ersetzt, [...] Ref: HTML4 Sepc

44voto

EncodeURIComponent verschlüsselt nicht -_.!~*'() Problem bei der Übermittlung von Daten an php in Form eines xml-Strings.

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

Wie Sie sehen können, ist das einfache Anführungszeichen nicht verschlüsselt. Um das Problem zu lösen, habe ich zwei Funktionen erstellt, um das Problem in meinem Projekt zu lösen, um die URL zu kodieren:

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

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

5 Stimmen

Auch das #-Zeichen (Pfund/Bindestrich/Zahl), das %23 entspricht, wird nicht berücksichtigt.

3 Stimmen

@xr280xr Was meinen Sie? encodeURIComponent kodiert # in %23 (vielleicht war das 2014 nicht der Fall?)

38voto

Daniel Papasian Punkte 15817

EncodeURI() - die Funktion escape() ist für Javascript-Escaping, nicht für HTTP.

0 Stimmen

Wenn ich eine Url wie diese habe: var url = "http://kuler-api.adobe.com/rss/get.cfm?startIndex=0&itemsPe‌​rPage=20&timeSpan=0&‌​listType=rating" ... Und ich möchte über die Google Ajax API darauf zugreifen, etwa so: var gurl = "http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&ca‌​llback=?&q=" + url; ... dann muss ich escape(url) . encodeURI(url) funktioniert nicht mit solchen Parametern, wie es scheint.

15 Stimmen

Sie sollten ecnodeURIComponent(url) verwenden

2 Stimmen

Alle 3 Funktionen haben ihre Probleme. Es ist besser, eine eigene Funktion zu erstellen, die diese Aufgabe erfüllt.

21voto

30thh Punkte 10229

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

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