Manchmal werden die Leerzeichen mit einer URL für das +
Zeichen codiert, manchmal mit %20
. Was ist der Unterschied und warum sollte dies passieren?
Manchmal werden die Leerzeichen mit einer URL für das +
Zeichen codiert, manchmal mit %20
. Was ist der Unterschied und warum sollte dies passieren?
Antworten:
+
bedeutet ein Leerzeichen nur im application/x-www-form-urlencoded
Inhalt, z. B. den Abfrageteil einer URL:
http://www.example.com/path/foo+bar/path?query+name=query+value
In dieser URL ist der Parametername query name
mit einem Leerzeichen und der Wert ist query value
mit einem Raum, aber die Ordnernamen im Pfad ist buchstäblich foo+bar
, nicht foo bar
.
%20
ist eine gültige Methode zum Codieren eines Leerzeichens in einem dieser Kontexte. Wenn Sie also eine Zeichenfolge für die Aufnahme in einen Teil einer URL %20
per URL codieren müssen, ist es immer sicher, Leerzeichen durch und Pluszeichen durch zu ersetzen %2B
. Dies ist was z. encodeURIComponent()
tut in JavaScript. Leider ist es nicht das, was Urlencode in PHP macht ( Rawurlencode ist sicherer).
Siehe auch HTML 4.01 Spezifikationsanwendung / x-www-form-urlencoded
query+name=query+value
Parameter aus einem Formular mit <input name="query name" value="query value">
. Es wird nicht query%20name
aus einem Formular erstellt, aber es ist absolut sicher, dies stattdessen zu verwenden, z. Wenn Sie ein Formular einreichen, stellen Sie sich selbst für ein XMLHttpRequest
. Wenn Sie eine URL mit einem Leerzeichen haben, <a href="http://www.example.com/foo bar/">
verschlüsselt der Browser diese, %20
damit Sie Ihren Fehler beheben können, aber darauf verlassen Sie sich wahrscheinlich am besten nicht.
foo bar
zu foo+bar
?
encodeURIComponent(s).replace(/%20/g, '+')
wenn Sie wirklich brauchen+
http://www.example.com/some/path/to/resource?param1=value1
Der Teil vor dem Fragezeichen muss% -Codierung verwenden (also %20
für Leerzeichen). Nach dem Fragezeichen können Sie entweder %20
oder +
für ein Leerzeichen verwenden. Wenn Sie eine tatsächliche +
nach dem Fragezeichen benötigen, verwenden Sie %2B
.
decodeURIComponent
wird nicht decodiert es.
+
es sich um ein reserviertes Zeichen handelt , wird es vom Browser beibehalten.
+
{ foo: 'bar bar'}.to_query
foo=bar+bar
Die Antworten hier sind also alle etwas unvollständig. Die Verwendung von '% 20' zum Codieren eines Leerzeichens in URLs wird in RFC3986 explizit definiert, in dem definiert wird, wie ein URI erstellt wird. In dieser Spezifikation wird die Verwendung eines '+' zum Codieren von Leerzeichen nicht erwähnt. Wenn Sie sich ausschließlich an diese Spezifikation halten, muss ein Leerzeichen als '% 20' codiert werden.
Die Erwähnung der Verwendung von '+' zum Codieren von Leerzeichen stammt aus den verschiedenen Inkarnationen der HTML-Spezifikation - insbesondere in dem Abschnitt, der den Inhaltstyp 'application / x-www-form-urlencoded' beschreibt. Dies wird zum Buchen von Formulardaten verwendet.
In der HTML 2.0-Spezifikation (RFC1866) wurde in Abschnitt 8.2.2 ausdrücklich festgelegt, dass der Abfrageteil der URL-Zeichenfolge einer GET-Anforderung als "application / x-www-form-urlencoded" codiert werden soll. Dies legt theoretisch nahe, dass es legal ist, ein '+' in der URL in der Abfragezeichenfolge (nach dem '?') Zu verwenden.
Aber ... ist es wirklich so? Denken Sie daran, HTML ist selbst eine Inhaltsspezifikation, und URLs mit Abfragezeichenfolgen können mit anderen Inhalten als HTML verwendet werden. Während die späteren Versionen der HTML-Spezifikation weiterhin '+' als legal in 'application / x-www-form-urlencoded' definieren, lassen sie den Teil, der besagt, dass GET-Anforderungsabfragezeichenfolgen als dieser Typ definiert sind, vollständig weg. Tatsächlich wird die Codierung der Abfragezeichenfolge in nichts nach der HTML 2.0-Spezifikation erwähnt.
Was uns die Frage lässt - ist es gültig? Sicherlich gibt es eine Menge Legacy-Code, der '+' in Abfragezeichenfolgen unterstützt, und eine Menge Code, der es auch generiert. Die Chancen stehen also gut, dass Sie nicht brechen, wenn Sie '+' verwenden. (Und tatsächlich habe ich kürzlich alle Nachforschungen angestellt, weil ich eine wichtige Site entdeckt habe, die '% 20' in einer GET-Abfrage nicht als Leerzeichen akzeptiert hat. Sie haben tatsächlich KEIN Prozent codiertes Zeichen dekodiert. Also der Service, den Sie Die Verwendung kann ebenfalls relevant sein.)
Beim reinen Lesen der Spezifikationen, ohne dass die Sprache aus der HTML 2.0-Spezifikation in spätere Versionen übernommen wurde, werden URLs vollständig von RFC3986 abgedeckt, was bedeutet, dass Leerzeichen in '% 20' konvertiert werden sollten. Und das sollte auf jeden Fall der Fall sein, wenn Sie etwas anderes als ein HTML-Dokument anfordern.
%20
( <a href="?q=a b">
). Wenn Sie jedoch ein Formular senden, wird das +
Vorzeichen verwendet. Sie können dies überschreiben, indem Sie das +
Zeichen ( <a href="?q=a+b">
) explizit verwenden oder das Formular mit senden XMLHTTPRequest
.
Es ist besser, Leerzeichen immer als% 20 zu codieren, nicht als "+".
Es war RFC-1866 (HTML 2.0-Spezifikation), der festlegte, dass Leerzeichen in "application / x-www-form-urlencoded" Schlüssel-Wert-Paaren vom Inhaltstyp als "+" codiert werden sollten. (siehe Absatz 8.2.1. Unterabsatz 1.). Diese Art der Codierung von Formulardaten wird auch in späteren HTML-Spezifikationen angegeben. Suchen Sie nach relevanten Absätzen zu application / x-www-form-urlencoded.
Hier ist ein Beispiel für eine solche Zeichenfolge in einer URL, in der RFC-1866 das Codieren von Leerzeichen als Pluspunkte zulässt: "http://example.com/over/there?name=foo+bar". Erst nach "?" Können Leerzeichen gemäß RFC-1866 durch Pluszeichen ersetzt werden. In anderen Fällen sollten Leerzeichen in% 20 codiert werden. Da es jedoch schwierig ist, den Kontext zu bestimmen, ist es die beste Vorgehensweise, Leerzeichen niemals als "+" zu codieren.
Ich würde empfehlen, alle Zeichen außer "nicht reserviert" in RFC-3986, S. 2.3, prozentual zu codieren
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
Was ist der Unterschied: Siehe andere Antworten.
Bei Verwendung +
anstelle von %20
? Verwenden Sie diese +
Option, wenn Sie aus irgendeinem Grund die URL-Abfragezeichenfolge ( ?.....
) oder das Hash-Fragment ( #....
) besser lesbar machen möchten . Beispiel: Sie können dies tatsächlich lesen:
https://www.google.se/#q=google+doesn%27t+encode+:+and+uses+%2B+instead+of+spaces
( %2B
= +)
Aber das Folgende ist viel schwerer zu lesen: (zumindest für mich)
Ich würde denken, dass +
es unwahrscheinlich ist, dass irgendetwas kaputt geht, da Google es verwendet +
(siehe den ersten Link oben) und sie wahrscheinlich darüber nachgedacht haben. Ich werde +
mich nur benutzen, weil lesbar + Google denkt, dass es in Ordnung ist.