Adresa URL care codifică caracterul spațiu: + sau %20?

Când un spațiu dintr-o adresă URL este codificat la + și când este codificat la %20?


person BC.    schedule 27.10.2009    source sursă
comment
Această întrebare ar fi mai utilă ca și mai multe întrebări specifice limbii, nu?   -  person squarecandy    schedule 11.01.2015
comment
Posibilă duplicare a Când să codificați spațiul în plus (+) sau %20?   -  person user    schedule 16.04.2017
comment
@user întrebarea la care faceți legătura a fost pusă mai târziu, făcându-l înșelat, nu acesta.   -  person Warlike Chimpanzee    schedule 01.09.2017


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 ?.

person Joey    schedule 27.10.2009
comment
Deci, codificarea + ar fi, din punct de vedere tehnic, o codificare în mai multe părți/form-date, în timp ce codarea procentuală este application/x-www-form-urlencoded? - person BC.; 28.10.2009
comment
@BC: nu - 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
comment
Deci, este cel mai probabil să vedeți doar + în adresele URL în șirul de interogare după un ? Este o subestimare. Nu ar trebui să vedeți niciodată + în partea de cale a adresei URL, deoarece nu va face ceea ce vă așteptați (spațiu). - person Adam Gent; 22.07.2011
comment
@McDowell răspunsul dvs., comentariul de la BC mi-a fost foarte util, împreună cu contribuția lui Adam Gent - person Chris Marisic; 09.07.2012
comment
Bună, și eu sunt confuz, cândva am văzut cartea folosind +, dar cândva %20. Când utilizatorul trimite formularul, cum codifică formularul spațiul? cu ce personaj? Rezultatul depinde de browser? - person Sam YC; 07.11.2012
comment
Deci, practic: ținta trimiterii GET este 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
comment
Uris de date utilizează aceeași codificare ca un uris. După ce am citit acel RFC, pot spune cu încredere că nu sunt suficient de inteligent pentru a descifra dacă codarea unui spațiu ar trebui permisă ca caracter +. Totuși, pot spune că dacă utilizați + în loc de %20, uri de date nu va funcționa în browsere. - person Rob Murphy; 28.04.2014
comment
@Rob: Probabil că nu este permis în URI-urile de date, într-adevăr. Deoarece, așa cum s-a menționat, este doar în partea de interogare în care este folosit +. - person Joey; 28.04.2014
comment
Rețineți că pentru linkurile de e-mail, aveți nevoie de %20 și nu de + după ?. De exemplu, 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
comment
Acest lucru m-a ajutat, stackoverflow.com /questions/5572718/ - person zeros-and-ones; 19.12.2017
comment
Problema cu utilizarea plus este că, dacă doriți să acceptați semnele plus distinct de spații precum ?search=The A+ School - person Curtis; 01.08.2019

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ă.

Sursa

person Matas Vaitkevicius    schedule 29.04.2015
comment
›› ar trebui să aveți %20 înainte de ? și + după Îmi pare rău pentru întrebarea proastă. Știu puțin cumva acel parametru de hashtag este folosit după? parametru semnul întrebării. Deși este oarecum diferit, deoarece folosirea # nu reîncarcă pagina. Dar am încercat să folosesc %20 și semnul + după hashtag-ul # și se pare că nu funcționează. Care trebuie folosit după #? - person Philcyb; 22.12.2015
comment
@Philcyb Poate doriți să citiți acest en.wikipedia.org/wiki/Percent-encoding - person Matas Vaitkevicius; 23.12.2015
comment
Partea de interogare are de fapt un standard oficial? M-am gândit că acea parte este specifică aplicației. 99,99% dintre aplicații folosesc 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
comment
Vă mulțumim că ați subliniat că inconsecvența confuză se datorează designului vechi rupt. - person wlnirvana; 09.04.2020
comment
De fapt, tocmai am aruncat o privire la articolul de pe blogul LunaTech, la care l-ai referit cu amabilitate, iar mesajul de acasă pare să fie mai degrabă ca: Trebuie să folosești %20 și nu + înainte de ?, 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
comment
Wow omule. Trebuie să spun că graficul în ASCII arată grozav. - person Miłosz Brzechczyn; 09.06.2021

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+'
person Rui Vieira    schedule 27.10.2009
comment
Nu hardcoding. Încerc să determin din perspectivă estetică cum vor arăta URL-urile mele care conțin spații. - person BC.; 28.10.2009
comment
Bună, și eu sunt confuz, când utilizatorul trimite formularul html, cum codifică formularul spațiul? cu ce personaj? Rezultatul depinde de browser? - person Sam YC; 07.11.2012
comment
Și metoda URLEncoder.encode() din Java o convertește și în +. - person рüффп; 24.10.2014
comment
Și apoi apare întrebarea cum să tratați codificarea în corpul unei solicitări POST: Tipul conținut: application/x-www-form-urlencoded unde parametrii sunt sub forma a=b&c=d, dar nu sunt într-o adresă URL, doar corpul documentului. Au făcut o adevărată mizerie din această problemă și este al naibii de dificil să găsești răspunsuri definitive. - person fyngyrz; 05.12.2014
comment
Perls uri_escape() le tratează ca %20 - person someuser; 08.02.2015
comment
O problemă cu %20 este că dacă îl adăugați la o adresă URL, serverul dvs. îl redirecționează către o nouă adresă URL cu aceeași interogare, ar putea codifica procentul și ajungeți cu %2520 în loc de %20 - person Curtis; 01.08.2019

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.

person Maxim Masiutin    schedule 27.10.2016
comment
De ce ar trebui să-i pese cuiva de specificațiile HTML dacă resursa solicitată nu este HTML? Am văzut + în unele API-uri web care nu răspund cu HTML, de ex. cereti un pdf. Consider că este greșit că nu folosesc %20. - person The incredible Jan; 12.10.2017
comment
@TheincredibleJan, sunt de acord cu tine. Despre asta este răspunsul meu. - person Maxim Masiutin; 02.04.2018
comment
@MaximMasiutin Când răspunsul tău spune Acesta este un MAI, nu un MUST, la ce specificație te referi? Mă chinui să găsesc o specificație care să-l aibă ca și mai. În w3.org/TR /1999/REC-html401-19991224/interact/ folosind „+” (în secțiunea de interogare) se află într-o secțiune „trebuie” a specificației. - person JosephH; 07.05.2019
comment
@JosephH - mulțumesc pentru notă. Este opinia mea personală despre MAI. Am editat postarea. Ceea ce am vrut să spun este că specificația HTML pe care ați citat-o ​​definește +, dar în contextul URL-ului se aplică alte reguli, care permit codificarea spațiilor ca %20. - person Maxim Masiutin; 03.06.2019