Wann ist ein Leerzeichen in einer URL codiert +
und wann ist es codiert %20
?
Wann ist ein Leerzeichen in einer URL codiert +
und wann ist es codiert %20
?
Antworten:
Aus Wikipedia (Hervorhebung und Link hinzugefügt):
Wenn Daten, die in HTML-Formulare eingegeben wurden, gesendet werden, werden die Formularfeldnamen und -werte codiert und in einer HTTP-Anforderungsnachricht mit der Methode GET oder POST oder in der Vergangenheit per E-Mail an den Server gesendet. Die standardmäßig verwendete Codierung basiert auf einer sehr frühen Version der allgemeinen URI- Prozentcodierungsregeln mit einer Reihe von Änderungen, z. B. der Normalisierung von Zeilenumbrüchen und dem Ersetzen von Leerzeichen durch "+" anstelle von "% 20". Der auf diese Weise codierte MIME-Datentyp ist application / x-www-form-urlencoded und wird derzeit (immer noch sehr veraltet) in den HTML- und XForms-Spezifikationen definiert.
Die tatsächliche prozentuale Codierung wird verwendet, %20
während Formulardaten in URLs in einer geänderten Form verwendet werden +
. Daher werden Sie höchstwahrscheinlich nur +
in URLs in der Abfragezeichenfolge nach einem angezeigt ?
.
multipart/form-data
verwendet MIME-Codierung; application/x-www-form-urlencoded
verwendet +
und richtig codierte URIs verwenden %20
.
http://www.bing.com/search?q=hello+world
und eine Ressource mit Leerzeichen im Namenhttp://camera.phor.net/cameralife/folders/2012/2012-06%20Pool%20party/
mailto:support@example.org?subject=I%20need%20help
. Wenn Sie dies mit + versucht haben, wird die E-Mail mit + es anstelle von Leerzeichen geöffnet.
Diese Verwirrung ist darauf zurückzuführen, dass URLs bis heute "kaputt" sind.
Nehmen Sie zum Beispiel " http://www.google.com ". Dies ist eine URL. Eine URL ist ein Uniform Resource Locator und (in den meisten Fällen) ein Zeiger auf eine Webseite. URLs haben seit der ersten Spezifikation im Jahr 1994 eine sehr genau definierte Struktur.
Wir können detaillierte Informationen über die URL " http://www.google.com " extrahieren :
+---------------+-------------------+
| Part | Data |
+---------------+-------------------+
| Scheme | http |
| Host | www.google.com |
+---------------+-------------------+
Wenn wir uns eine komplexere URL ansehen, wie zum Beispiel:
" https: // bob: bobby@www.lunatech.com: 8080 / file; p = 1? q = 2 # Drittel "
Wir können die folgenden Informationen extrahieren:
+-------------------+---------------------+
| Part | Data |
+-------------------+---------------------+
| Scheme | https |
| User | bob |
| Password | bobby |
| Host | www.lunatech.com |
| Port | 8080 |
| Path | /file;p=1 |
| Path parameter | p=1 |
| Query | q=2 |
| Fragment | third |
+-------------------+---------------------+
https://bob:bobby@www.lunatech.com:8080/file;p=1?q=2#third
\___/ \_/ \___/ \______________/ \__/\_______/ \_/ \___/
| | | | | | \_/ | |
Scheme User Password Host Port Path | | Fragment
\_____________________________/ | Query
| Path parameter
Authority
Die reservierten Zeichen sind für jedes Teil unterschiedlich.
Bei HTTP-URLs muss ein Leerzeichen in einem Pfadfragmentteil mit "% 20" (nicht, absolut nicht "+") codiert werden, während das Zeichen "+" im Pfadfragmentteil nicht codiert werden kann.
Im Abfrageteil können Leerzeichen jetzt entweder mit "+" (aus Gründen der Abwärtskompatibilität: Versuchen Sie nicht, im URI-Standard danach zu suchen) oder mit "% 20" codiert werden, während das Zeichen "+" (aufgrund dieser Mehrdeutigkeit) verwendet wird ) muss auf "% 2B" maskiert werden.
Dies bedeutet, dass die Zeichenfolge "blau + hellblau" in den Pfad- und Abfrageteilen unterschiedlich codiert werden muss:
" http://example.com/blue+light%20blue?blue%2Blight+blue ".
Daraus können Sie schließen, dass die Codierung einer vollständig erstellten URL ohne eine syntaktische Kenntnis der URL-Struktur nicht möglich ist.
Das läuft darauf hinaus:
Sie sollten %20
vor ?
und +
nach haben.
key1=value1&key1=value2
wenn Schlüssel und Werte mit den folgenden Regeln codiert werden. encodeURIComponent
AFAIK Der Inhalt des Abfrageteils liegt jedoch zu 100% bei der App. Ansonsten geht es nur zum ersten #
gibt es keine offizielle Kodierung.
Ich würde empfehlen %20
.
Codierst du sie hart?
Dies ist jedoch sprachübergreifend nicht sehr konsistent. Wenn ich mich nicht irre, urlencode()
behandelt PHP Leerzeichen so, wie +
Python sie urlencode()
behandelt %20
.
BEARBEITEN:
Es scheint, ich irre mich. Pythons urlencode()
(zumindest in 2.7.2) verwendet quote_plus()
anstelle von quote()
und codiert Leerzeichen daher als "+". Es scheint auch, dass die W3C-Empfehlung das "+" gemäß hier lautet: http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1
Tatsächlich können Sie dieser interessanten Debatte über Pythons eigenen Issue-Tracker folgen, wie Leerzeichen codiert werden sollen: http://bugs.python.org/issue13866 .
EDIT # 2:
Ich verstehe, dass die gebräuchlichste Art, "" zu codieren, "+" ist, aber nur eine Notiz, es mag nur ich sein, aber ich finde das etwas verwirrend:
import urllib
print(urllib.urlencode({' ' : '+ '})
>>> '+=%2B+'
URLEncoder.encode()
Methode in Java konvertiert es auch in +
.
Ein Leerzeichen darf nur im Abfrageteil einer URL vom Typ "application / x-www-form-urlencoded" für "application / x-www-form-urlencoded" mit "+" codiert werden. Meiner Meinung nach ist dies ein MAI, kein MUSS. In den übrigen URLs wird es als% 20 codiert.
Meiner Meinung nach ist es besser, Leerzeichen immer als% 20 und nicht als "+" zu codieren, selbst im Abfrageteil einer URL, da in der HTML-Spezifikation (RFC-1866) angegeben wurde, dass Leerzeichen als "codiert" werden sollen. + "in" application / x-www-form-urlencoded "Schlüssel-Wert-Paare vom Inhaltstyp (siehe Absatz 8.2.1. Unterabsatz 1.)
Diese Art der Codierung von Formulardaten wird auch in späteren HTML-Spezifikationen angegeben. Suchen Sie beispielsweise nach relevanten Absätzen zu application / x-www-form-urlencoded in der HTML 4.01-Spezifikation usw.
Hier ist eine Beispielzeichenfolge in der URL, in der die HTML-Spezifikation das Codieren von Leerzeichen als Pluspunkte zulässt: " http://example.com/over/there?name=foo+bar ". Also, erst nach „?“, Leerzeichen können durch Pluszeichen ersetzt werden . In anderen Fällen sollten Leerzeichen in% 20 codiert werden. Da es jedoch schwierig ist, den Kontext korrekt zu bestimmen, empfiehlt es sich, 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 / "-" / "." / "_" / "~"
Die Implementierung hängt von der von Ihnen gewählten Programmiersprache ab.
Wenn Ihre URL nationale Zeichen enthält, codieren Sie diese zuerst in UTF-8 und anschließend in Prozent.