Când un spațiu dintr-o adresă URL este codificat la +
și când este codificat la %20
?
Adresa URL care codifică caracterul spațiu: + sau %20?
Răspunsuri (4)
Din Wikipedia (subliniere și link adăugat):
Când datele care au fost introduse în formularele HTML sunt trimise, numele și valorile câmpurilor de formular sunt codificate și trimise la server într-un mesaj de solicitare HTTP folosind metoda GET sau POST sau, istoric, prin e-mail. Codificarea utilizată în mod prestabilit se bazează pe o versiune foarte timpurie a regulilor generale de codificare procentuală URI, cu un numărul de modificări, cum ar fi normalizarea liniei noi și înlocuirea spațiilor cu „+” în loc de „%20”. Tipul MIME de date codificat astfel este application/x-www-form-urlencoded și este definit în prezent (încă într-un mod foarte depășit) în specificațiile HTML și XForms.
Deci, codarea procentuală real folosește %20
, în timp ce datele formularului din adresele URL sunt într-o formă modificată care utilizează +
. Deci, este cel mai probabil să vedeți numai +
în adresele URL din șirul de interogare după un ?
.
multipart/form-data
folosește codificarea MIME; application/x-www-form-urlencoded
folosește +
și URI-urile codificate corect folosesc %20
.
- person McDowell; 28.10.2009
http://www.bing.com/search?q=hello+world
și o resursă cu spațiu în numele http://camera.phor.net/cameralife/folders/2012/2012-06%20Pool%20party/
- person William Entriken; 14.04.2013
+
.
- person Joey; 28.04.2014
mailto:[email protected]?subject=I%20need%20help
. Dacă ați încercat asta cu +, e-mailul se va deschide cu +es în loc de spații.
- person Sygmoral; 19.02.2015
Această confuzie se datorează faptului că adresele URL sunt încă „rupte” până în prezent.
Luați, de exemplu, „http://www.google.com". Aceasta este o adresă URL. Un URL este un Uniform Resource Locator și este într-adevăr un indicator către o pagină web (în cele mai multe cazuri). URL-urile au de fapt o structură foarte bine definită de la prima specificație din 1994.
Putem extrage informații detaliate despre adresa URL „http://www.google.com":
+---------------+-------------------+
| Part | Data |
+---------------+-------------------+
| Scheme | http |
| Host | www.google.com |
+---------------+-------------------+
Dacă ne uităm la o adresă URL mai complexă, cum ar fi:
„https://bob:[email protected]:8080/file;p=1?q=2#third"
putem extrage următoarele informații:
+-------------------+---------------------+
| 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
Caracterele rezervate sunt diferite pentru fiecare parte.
Pentru adresele URL HTTP, un spațiu dintr-o parte a fragmentului de cale trebuie să fie codificat la „%20” (nu, absolut nu „+”), în timp ce caracterul „+” din partea fragmentului de cale poate fi lăsat necodat.
Acum, în partea de interogare, spațiile pot fi codificate fie la „+” (pentru compatibilitate inversă: nu încercați să îl căutați în standardul URI) sau „%20” în timp ce caracterul „+” (ca urmare a acestei ambiguități). ) trebuie să fie evacuat în „%2B”.
Aceasta înseamnă că șirul „albastru+albastru deschis” trebuie să fie codificat diferit în părțile de cale și interogare:
„http://example.com/blue+light%20blue?blue%2Blight+blue”.
De aici puteți deduce că codificarea unui URL complet construit este imposibilă fără o conștientizare sintactică a structurii URL.
Acest lucru se rezumă la:
Ar trebui să aveți %20
înainte de ?
și +
după.
key1=value1&key1=value2
unde cheile și valorile sunt codificate cu orice reguli encodeURIComponent
urmează, dar AFAIK conținutul părții de interogare depinde în întregime de aplicație. Altfel, merge doar la primele #
, nu există codare oficială.
- person gman; 26.07.2018
?
, ci după ?
este pur și simplu o chestiune de gust. Pentru dragostea lui Dumnezeu, oameni buni, folosiți întotdeauna codificarea bazată pe semne procentuale și eliberați spațiul creierului pentru lucruri mai importante.
- person nydame; 06.12.2020
Aș recomanda %20
.
Le codificați greu?
Totuși, acest lucru nu este foarte consistent între limbi. Dacă nu mă înșel, în PHP urlencode()
tratează spațiile ca +
, în timp ce urlencode()
din Python le tratează ca %20
.
EDITAȚI | ×:
Se pare că mă înșel. urlencode()
din Python (cel puțin în 2.7.2) folosește quote_plus()
în loc de quote()
și astfel codifică spațiile ca „+”. Se pare, de asemenea, că recomandarea W3C este „+” ca aici: http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1
Și, de fapt, puteți urmări această dezbatere interesantă pe propriul instrument de urmărire a problemelor Python despre ce să folosiți pentru a codifica spațiile: http://bugs.python.org/issue13866.
EDIT #2:
Înțeleg că cel mai comun mod de a codifica „ ” este „+”, dar doar o notă, poate fi doar eu, dar mi se pare puțin confuz:
import urllib
print(urllib.urlencode({' ' : '+ '})
>>> '+=%2B+'
URLEncoder.encode()
din Java o convertește și în +
.
- person рüффп; 24.10.2014
Un spațiu poate fi codificat doar la „+” în partea de interogare a unei adrese URL „application/x-www-form-urlencoded” de tip conținut perechi cheie-valoare. După părerea mea, acesta este un MAI, nu un MUST. În restul adreselor URL, este codificat ca %20.
În opinia mea, este mai bine să codificați întotdeauna spațiile ca %20, nu ca „+”, chiar și în partea de interogare a unei adrese URL, deoarece specificația HTML (RFC-1866) este cea care a specificat că caracterele de spațiu trebuie codificate ca „ +" în perechile „application/x-www-form-urlencoded” tip conținut cheie-valoare (a se vedea paragraful 8.2.1. subparagraful 1.)
Acest mod de codificare a datelor din formular este prezentat și în specificațiile HTML ulterioare. De exemplu, căutați paragrafe relevante despre application/x-www-form-urlencoded în specificația HTML 4.01 și așa mai departe.
Iată un exemplu de șir în URL în care specificația HTML permite codificarea spațiilor ca plusuri: „http://example.com/over/there?name=foo+bar”. Deci, numai după „?”, spațiile pot fi înlocuite cu plusuri. În alte cazuri, spațiile ar trebui să fie codificate la %20. Dar, deoarece este greu să determinați corect contextul, este cea mai bună practică să nu codificați niciodată spațiile ca „+”.
Aș recomanda codificarea procentuală a tuturor caracterelor, cu excepția „nerezervate” definite în RFC-3986, p.2.3
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
Implementarea depinde de limbajul de programare ales.
Dacă adresa URL conține caractere naționale, mai întâi codificați-le în UTF-8 și apoi codificați rezultatul în procente.