Wann muss der Speicherplatz in Plus (+) oder% 20 codiert werden?


Antworten:


481

+bedeutet ein Leerzeichen nur im application/x-www-form-urlencodedInhalt, 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 namemit einem Leerzeichen und der Wert ist query valuemit einem Raum, aber die Ordnernamen im Pfad ist buchstäblich foo+bar, nicht foo bar .

%20ist 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 %20per 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


5
Ich bin wirklich verwirrt. Meine Frage ist, wann der Browser das erste Formular ausführt und wann das zweite Formular.
Muhammad Hewedy

11
Der Browser erstellt einen query+name=query+valueParameter aus einem Formular mit <input name="query name" value="query value">. Es wird nicht query%20nameaus 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, %20damit Sie Ihren Fehler beheben können, aber darauf verlassen Sie sich wahrscheinlich am besten nicht.
Bobince

6
was JavaScript - Funktion machen foo barzu foo+bar?
Sisir

21
@Sisir: Es gibt keine JS-Funktion, die die URL-Formularcodierung übernimmt. Sie können natürlich tun, encodeURIComponent(s).replace(/%20/g, '+')wenn Sie wirklich brauchen+
Bobince

2
Das ist ein sehr, sehr verwirrendes Beispiel für etwas, das form-urlencodiert ist. Es hat nichts mit URLs zu tun.
Dave Van den Eynde

54

http://www.example.com/some/path/to/resource?param1=value1

Der Teil vor dem Fragezeichen muss% -Codierung verwenden (also %20für Leerzeichen). Nach dem Fragezeichen können Sie entweder %20oder +für ein Leerzeichen verwenden. Wenn Sie eine tatsächliche +nach dem Fragezeichen benötigen, verwenden Sie %2B.


6
@ DaveVandenEynde Warum nicht?
Cerberos

10
weil es falsch ist. Es ist Teil des alten Medientyps application / x-www-form-urlencoded, der nicht für URLs gilt. Auch decodeURIComponentwird nicht decodiert es.
Dave Van den Eynde

3
Ja, es wurde wahrscheinlich von RFC 1630 kopiert und war nie wirklich ein Standard. tools.ietf.org/html/rfc3986 ist der Standard (erneut aktualisiert für IPv6 oder so). Sicher, Browser "unterstützen" es immer noch, aber was bedeutet das? Es ist entweder der Server- oder der Clientcode, der die Abfragezeichenfolge liest und dekodiert, nicht der Browser. Der Browser gibt es einfach hin und her und da +es sich um ein reserviertes Zeichen handelt , wird es vom Browser beibehalten.
Dave Van den Eynde

18
Google verwendet + für Leerzeichen in seinen Such-URLs ( google.com/#q=perl+equivalent+to+php+urlencode+spaces+as+%2B ).
Justin

2
Zu +{ foo: 'bar bar'}.to_queryfoo=bar+bar
Ihrer Information

46

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.


Um Ihre Antwort zu ergänzen, codiert Chrome standardmäßig Leerzeichen in URLs als %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.
X-Yuri

Es ist wirklich schwer zu verstehen , welchen Zweck es hat, URLSearchParams developer.google.com/web/updates/2016/01/urlsearchparams hinzuzufügen , was in gewisser Weise funktioniert (SPACE in '+' serialisieren). Es wird sogar nicht in IE11 unterstützt!
Nymphetamin

9

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 / "-" / "." / "_" / "~"

1
In .Net Framework verwendet UrlEncode in QueryString '+', in modernen .Net Core% 20 wird jedoch verwendet
Michael Freidgeim

@ MiFreidgeimSO-stopbeingevil Vielen Dank, dass Sie uns informiert haben. Es scheint, dass der moderne .Net Core entschieden hat, konsistenter und kompatibler zu sein.
Maxim Masiutin

2

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)

https://www.google.se/#q=google%20doesn%27t%20oops%20:%20%20this%20text%20%2B%20is%20different%20spaces

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.


7
Ich sage, das Argument "Lesbarkeit" ist die beste Verteidigung für '+'. Das Argument "Google macht es" ist trügerisch en.wikipedia.org/wiki/Argument_from_authority
FlipMcF

2
@FlipMcF Auf der trügerischen Wikipedia-Seite über das Argument der Autorität geht es um "wenn eine Autorität zu einem Thema außerhalb ihres Fachgebiets zitiert wird oder wenn die zitierte Autorität kein echter Experte ist " - ich denke jedoch, dass Computer, HTTP und URL Codierung Sachen innerhalb Googles Fachgebiet.
KajMagnus

3
@FlipMcF Das Zitieren des Verhaltens von Google ist in diesem Fall ein gültiges Argument für die Verwendung von "+" in URLs. Es ist nicht so, dass Google eine Autorität ist, aber Google ist wahrscheinlich das größte Internetunternehmen. Wenn sie etwas unternehmen, ist es höchst unwahrscheinlich, dass Browser eines Tages beschließen, diese Praxis nicht mehr zu unterstützen. Außerdem ist Google Chrome einer der Browser mit dem höchsten Anteil und unterstützt alles, was Google möchte. Alles in allem würde ich sagen, dass niemand, der "+" anstelle von "% 20" verwendet, in absehbarer Zeit Schwierigkeiten haben wird.
jdferreira

Ich würde dieses Argument gerne woanders fortsetzen, wo es einen Appell an die Popularität gibt, sich zu weigern, einen Appell an die Autorität anzuerkennen. Zumindest können wir uns alle auf eines einigen: '+' ist '% 20' überlegen
FlipMcF

1
Tatsächlich ist die URL mit% 20 viel einfacher zu lesen, da (Desktop-) Browser die dekodierte URL am unteren Rand des Fensters anzeigen, wenn Sie den Mauszeiger über den Link bewegen. Pluszeichen werden unverändert angezeigt.
Martin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.