2009-06-17 9 views
159

Ich bin mir bewusst, dass ein + in der Abfragezeichenfolge einer URL ein Leerzeichen darstellt. Ist dies auch außerhalb des Abfrage-String-Bereichs der Fall? Das heißt, wird die folgende URL:URLs und Pluszeichen

http://a.com/a+b/c 

tatsächlich darstellen:

http://a.com/a b/c 

(und somit müssen kodiert werden, wenn es tatsächlich ein + sein soll), oder tut es in der Tat tatsächlich darstellen a+b/c?

+0

http://www.w3schools.com/tags/ref_urlencode. asp –

+4

Beachten Sie, dass in PHP urldecode die% 2b (codiert +) in ein Leerzeichen dekodiert. Um dies zu vermeiden, verwenden Sie 'rawurldecode'. Ich sage das hier als Referenz, weil dies ein hoch bewertetes Ergebnis bei der Google-Suche nach "php url decode breakes on plus symbol" ist. – danielson317

+1

Mögliches Duplikat von [Wenn Platz zu Plus (+) oder% 20 zu codieren?] (Http://stackoverflow.com/questions/2678551/when-to-encode-space-to-plus-or-20) – user

Antwort

136
  • Percent Codierung in dem Wegabschnitt einer URL zu dekodierenden wird erwartet wird, aber
  • irgendwelche + Zeichen in der Pfadkomponente ist erwartet, dass sie buchstäblich behandelt werden.

Um explizit zu sein: + ist nur ein Sonderzeichen in der Abfragekomponente.

+5

+1 Leider verstehen viele "URL-Codierer/Encoder" in freier Wildbahn das nicht. ZB http://www.sislands.com/coin70/week6/encoder.htm http://www.keyone.co.uk/tools-url-encoder.asp http://meyerweb.com/eric/tools /dencoder/ – leonbloy

+6

@Stobor: Zitat benötigt. – bukzor

+5

@Stobor Hat der RFC jemals angegeben, dass das Zeichen '+' als Leerzeichen in der Abfragekomponente interpretiert wird? Oder ist es einfach eine Regel "aus der Wildnis"? – Pacerier

-3

Du sollst immer URLs kodieren.

Hier ist, wie Ruby-URL codiert:

irb(main):008:0> CGI.escape "a.com/a+b" 
=> "a.com%2Fa%2Bb" 
+0

Entschuldigung , erlaube mir, etwas zu klären. Wenn der Benutzer "http://a.ac.at/a+b/" eingibt, dann ist dies so zu interpretieren, dass ein% 20b und nicht ein% 2Bb gemeint ist. –

+8

Ich bin mir nicht sicher, ob das richtig ist. Laut RFC2396 (http://www.ietf.org/rfc/rfc2396.txt) sind Pluszeichen keine reservierten Zeichen im Pfad (Segmente) des URI, nur die Abfragekomponente. Das scheint zu implizieren, dass sie nicht URL-codiert sein müssen und daher nicht als Leerzeichen im Pfad interpretiert werden dürfen, sondern nur in der Abfrage. – tlrobinson

+0

Ah okay. Es wäre ein% 2Bb! –

158

Sie eine schöne Liste der entsprechenden URL-codierte Zeichen auf W3Schools finden.

  • + wird %2B
  • Raum %20
+13

Es ist völlig legal, dass wörtliche "+" - Zeichen in der * path * -Komponente einer URL erscheinen. –

+1

Um ein Literal + vom Backend (oder zumindest PHP) zu erhalten, muss es dreifach kodiert sein: '% 25252B' – Umbrella

+2

Diese Antwort ist für die Frage völlig irrelevant. –

-3

Versuchen Sie unter:

<script type="text/javascript"> 

function resetPassword() { 
    url: "submitForgotPassword.html?email="+fixEscape(Stringwith+char); 
} 
function fixEscape(str) 
{ 
    return escape(str).replace("+", "%2B"); 
} 
</script> 
+2

Ich finde es sehr merkwürdig, dass zwei Leute diese Antwort gewählt haben. Es hat mit der Frage buchstäblich nichts zu tun. –

+1

Wie wäre es mit anderen Zeichen * @ - _ +./ – Ravi

+0

@AndrewBarber Warum fanden Sie es irrelevant? + wird% 2B –

2

Verwendung encodeURIComponent Funktion URL zu beheben, ist es auf Browser funktioniert und node.js

res.redirect("/signin?email="+encodeURIComponent("[email protected]")); 


> encodeURIComponent("http://a.com/a+b/c") 
'http%3A%2F%2Fa.com%2Fa%2Bb%2Fc' 
12

Leerzeichen nur als "+" codiert werden können in einem Kontext: application/x-www-form-urlencodierte Schlüssel/Wert-Paare.

Die RFC-1866 (HTML 2.0-Spezifikation), Absatz 8.2.1. Unterabsatz 1. sagt: "Die Formularfeldnamen und Werte sind maskiert: Leerzeichen werden durch" + "ersetzt, und dann sind reservierte Zeichen maskiert").

Hier ist ein Beispiel für eine solche Zeichenfolge in URL, wo RFC-1866 Codierung Leerzeichen als Pluszeichen ermöglicht: "http://example.com/over/there?name=foo+bar". Daher können Leerzeichen erst nach "?" Durch Pluszeichen ersetzt werden (in anderen Fällen sollten Leerzeichen in% 20 codiert werden). Diese Art der Kodierung von Formulardaten wird auch in späteren HTML-Spezifikationen angegeben. Suchen Sie beispielsweise nach relevanten Abschnitten zu Anwendung/x-www-form-urlencoded in HTML 4.01 Specification und so weiter.

Da es jedoch schwierig ist, den Kontext immer korrekt zu bestimmen, empfiehlt es sich, Leerzeichen niemals als "+" zu codieren. Es ist besser, alle Zeichen mit Ausnahme von "nicht reserviert", die in RFC-3986, S.2.3 definiert sind, zu kodieren. Hier ist ein Codebeispiel, das veranschaulicht, was codiert werden sollte.Es wird in Delphi (Pascal) Programmiersprache gegeben, aber es ist sehr leicht zu verstehen, wie es für jeden Programmierer unabhängig von der Sprache arbeitet besaß:

(* percent-encode all unreserved characters as defined in RFC-3986, p.2.3 *) 
function UrlEncodeRfcA(const S: AnsiString): AnsiString; 
const  
    HexCharArrA: array [0..15] of AnsiChar = 'ABCDEF'; 
var 
    I: Integer; 
    c: AnsiChar; 
begin 
// percent-encoding, see RFC-3986, p. 2.1 
    Result := S; 
    for I := Length(S) downto 1 do 
    begin 
    c := S[I]; 
    case c of 
     'A' .. 'Z', 'a' .. 'z', // alpha 
     '0' .. '9',    // digit 
     '-', '.', '_', '~':; // rest of unreserved characters as defined in the RFC-3986, p.2.3 
     else 
     begin 
      Result[I] := '%'; 
      Insert('00', Result, I + 1); 
      Result[I + 1] := HexCharArrA[(Byte(C) shr 4) and $F)]; 
      Result[I + 2] := HexCharArrA[Byte(C) and $F]; 
     end; 
    end; 
    end; 
end; 

function UrlEncodeRfcW(const S: UnicodeString): AnsiString; 
begin 
    Result := UrlEncodeRfcA(Utf8Encode(S)); 
end;