wake-up-neo.com

URL, die das Leerzeichen codiert: + oder% 20?

Wann ist ein Leerzeichen in einer URL in + und wann in %20 codiert?

657
BC.

Aus Wikipedia (Hervorhebung und Link hinzugefügt):

Bei der Übermittlung von Daten, die in HTML-Formulare eingegeben wurden, werden die Namen und Werte der Formularfelder 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 einem Anzahl der Änderungen wie Zeilenumbruch und Ersetzen von Leerzeichen durch "+" anstelle von "% 20". Der MIME-Datentyp, der auf diese Weise codiert wird, ist application/x-www-form-urlencoded und ist derzeit definiert (noch sehr veraltet) ) in den HTML- und XForms-Spezifikationen.

Die echte Prozentcodierung verwendet also %20, während Formulardaten in URLs in einer modifizierten Form vorliegen, die + verwendet. Sie werden also höchstwahrscheinlich nur + in URLs in der Abfragezeichenfolge nach ? sehen.

386
Joey

Diese Verwirrung ist darauf zurückzuführen, dass URLs bis heute "defekt" 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 Verweis auf eine Webseite. URLs haben seit der ersten Spezifikation im Jahr 1994 eine sehr gut definierte Struktur.

Wir können detaillierte Informationen zur 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: [email protected]: 8080/file; p = 1? q = 2 # third "

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:[email protected]:8080/file;p=1?q=2#third
\___/   \_/ \___/ \______________/ \__/\_______/ \_/ \___/
  |      |    |          |          |      | \_/  |    |
Scheme User Password    Host       Port  Path |   | Fragment
        \_____________________________/       | Query
                       |               Path parameter
                   Authority

Die reservierten Zeichen sind für jeden Teil unterschiedlich.

Bei HTTP-URLs muss ein Leerzeichen in einem Pfadfragmentteil mit "% 20" (nicht, absolut nicht mit "+") codiert werden, während das "+" - Zeichen im Pfadfragmentteil nicht codiert werden kann.

Im Abfrageteil können Leerzeichen entweder mit "+" (aus Gründen der Abwärtskompatibilität: Versuchen Sie nicht, im URI-Standard danach zu suchen) oder mit "% 20", während das Zeichen "+" (aufgrund dieser Mehrdeutigkeit) verwendet wird ) muss nach "% 2B" maskiert werden.

Dies bedeutet, dass die Zeichenfolge "Blau + Hellblau" im Pfad- und Abfrageteil unterschiedlich codiert werden muss:

" http://example.com/blue+light%20blue?blue%2Blight+blue ".

Daraus können Sie schließen, dass das Codieren einer vollständig erstellten URL ohne syntaktische Kenntnis der URL-Struktur nicht möglich ist.

Das läuft auf Folgendes hinaus:

Sie sollten %20 vor dem ? und + danach haben.

Quelle

261

Ich würde %20 empfehlen.

Codierst du sie hart?

Dies ist jedoch nicht in allen Sprachen einheitlich. Wenn ich mich nicht irre, werden Leerzeichen in PHP urlencode() als + behandelt, während Pythons urlencode() sie als %20 behandelt.

BEARBEITEN:

Es scheint, dass ich mich irre. Pythons urlencode() (zumindest in 2.7.2) verwendet quote_plus() anstelle von quote() und codiert daher Leerzeichen als "+". Es scheint auch, dass die W3C-Empfehlung das "+" laut hier ist: http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1

Tatsächlich können Sie diese interessante Debatte über Pythons eigenen Issue Tracker verfolgen, um herauszufinden, wie Leerzeichen codiert werden sollen: http://bugs.python.org/issue13866 .

EDIT # 2:

Ich verstehe, dass die gebräuchlichste Art "" als "+" zu codieren ist, aber nur eine Anmerkung, es mag nur ich sein, aber ich finde das ein bisschen verwirrend:

import urllib
print(urllib.urlencode({' ' : '+ '})

>>> '+=%2B+'
24
Rui Vieira

Ein Leerzeichen darf nur mit "+" in den Schlüsselwertpaaren vom Typ "application/x-www-form-urlencoded" codiert werden, die einen Teil einer URL abfragen. Meiner Meinung nach ist dies ein MAI, kein MUSS. In den restlichen URLs wird es als% 20 codiert.

Meiner Meinung nach ist es besser, Leerzeichen immer als% 20 und nicht als "+" zu codieren, auch nicht 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 "Inhaltstyp-Schlüsselwertpaare (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 Kodieren von Leerzeichen als Pluszeichen zulässt: " http://example.com/over/there?name=foo+bar ". Daher können Leerzeichen erst nach "?" Durch Pluszeichen ersetzt werden. In anderen Fällen sollten Leerzeichen mit% 20 codiert werden. Da es jedoch schwierig ist, den Kontext korrekt zu bestimmen, wird empfohlen, Leerzeichen niemals als "+" zu codieren.

Ich würde empfehlen, alle Zeichen mit Ausnahme von "nicht reserviert", wie in RFC-3986, S.2.3 definiert, in Prozent zu kodieren

unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"

Die Implementierung hängt von der gewählten Programmiersprache ab.

Wenn Ihre URL nationale Zeichen enthält, verschlüsseln Sie diese zuerst in UTF-8 und verschlüsseln Sie dann das Ergebnis in Prozent.

11
Maxim Masiutin