wake-up-neo.com

Sollen Leerzeichen in einer URL mit% 20 oder + codiert werden?

Soll ich in einer URL die Leerzeichen mit %20 Oder + Codieren? Welches Beispiel im folgenden Beispiel ist richtig?

www.mydomain.com?type=xbox%20360
www.mydomain.com?type=xbox+360

Unsere Firma lehnt sich an die erstere an, verwendet jedoch die Java Methode URLEncoder.encode(String, String) mit "xbox 360" (Und "UTF-8") gibt letzteres zurück .

Was ist der Unterschied?

107
MegaByter

Formulardaten (für GET oder POST) werden normalerweise als application/x-www-form-urlencoded Codiert: Dies gibt + Für Leerzeichen an.

URLs werden als RFC 1738 codiert, wodurch %20 Angegeben wird.

Theoretisch sollten Sie% 20 vor dem ? Und nach dem + haben:

example.com/foo%20bar?foo+bar
96
Greg

Gemäß W3C (und sie sind die offizielle Quelle für diese Dinge) kann ein Leerzeichen in der Abfragezeichenfolge (und nur in der Abfragezeichenfolge) entweder als "%20 "oder" + ". Aus dem Abschnitt "Abfragezeichenfolgen" unter "Empfehlungen":

Innerhalb der Abfragezeichenfolge ist das Pluszeichen als Kurzschreibweise für ein Leerzeichen reserviert. Daher müssen echte Pluszeichen codiert werden. Diese Methode wurde verwendet, um die Übergabe von Abfrage-URIs in Systemen zu vereinfachen, in denen Leerzeichen nicht zulässig waren.

Gemäß Abschnitt 3.4 von RFC2396 , der die offizielle Spezifikation für URIs im Allgemeinen ist, ist die "Abfrage" -Komponente URL-abhängig:

3.4. Abfragekomponente Die Abfragekomponente ist eine Zeichenfolge von Informationen, die von der Ressource interpretiert werden sollen.

   query         = *uric

Innerhalb einer Abfragekomponente sind die Zeichen ";", "/", "?", ":", "@", "&", "=", "+", "," Und "$" reserviert.

Es ist daher ein Fehler in der anderen Software, wenn URLs mit Leerzeichen in der Abfragezeichenfolge, die als "+" - Zeichen codiert sind, nicht akzeptiert werden.

Was den dritten Teil Ihrer Frage betrifft, besteht eine Möglichkeit (wenn auch etwas hässlich), die Ausgabe von URLEncoder.encode() zu korrigieren, darin, callreplaceAll("\\+","%20") auf den Rückgabewert zu setzen .

47
Adam Batkin

Diese Verwirrung ist darauf zurückzuführen, dass die URL bis heute "defekt" ist

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 address | www.google.com    |   
+---------------+-------------------+  

Wenn wir uns eine komplexere URL wie " https: // bob: [email protected]: 8080/file; p = 1? Q = 2 # third " ansehen, können wir die extrahieren folgende Information:

+-------------------+---------------------+
|        Part       |       Data          |
+-------------------+---------------------+
|  Scheme           | https               |
|  User             | bob                 |
|  Password         | bobby               |
|  Host address     | www.lunatech.com    |
|  Port             | 8080                |
|  Path             | /file               |
|  Path parameters  | p=1                 |
|  Query parameters | q=2                 |
|  Fragment         | third               |
+-------------------+---------------------+

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 in den Abfrageteilen 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.

Worauf es ankommt, ist

Sie sollten %20 vor dem ? und + nach haben

Quelle

14

Es ist sollte nicht wichtig, genauso wenig, als wenn Sie den Buchstaben A als% 41 codiert haben.

Wenn Sie es jedoch mit einem System zu tun haben, das eine Form nicht erkennt, müssen Sie dem System anscheinend nur das geben, was es erwartet, unabhängig davon, was in der "Spezifikation" steht.

6
Gary McGill

Sie können entweder verwenden - was bedeutet, dass sich die meisten Menschen für "+" entscheiden, da es besser lesbar ist.

5
Fenton