URL che codifica il carattere spazio: + o% 20?


Risposte:


425

Da Wikipedia (enfasi e collegamento aggiunti):

Quando vengono inviati dati immessi in moduli HTML, i nomi e i valori dei campi modulo vengono codificati e inviati al server in un messaggio di richiesta HTTP utilizzando il metodo GET o POST o, storicamente, via e-mail. La codifica utilizzata per impostazione predefinita si basa su una versione molto antica delle regole generali di codifica percentuale URI, con una serie di modifiche come la normalizzazione della nuova riga e la sostituzione di spazi con "+" anziché "% 20". Il tipo di dati MIME codificato in questo modo è application / x-www-form-urlencoded ed è attualmente definito (ancora in modo molto obsoleto) nelle specifiche HTML e XForms.

Pertanto, la codifica percentuale reale utilizza %20mentre i dati del modulo negli URL sono in una forma modificata che utilizza +. Quindi molto probabilmente vedrai +negli URL nella stringa di query solo dopo ?.


2
Quindi la codifica + sarebbe tecnicamente una codifica multipart / form-data, mentre la codifica percentuale è codificata da application / x-www-form-urlenced?
BC.

17
@BC: no - multipart/form-datausa la codifica MIME; application/x-www-form-urlencodedutilizza +e utilizza correttamente gli URI codificati %20.
McDowell,

8
"Quindi molto probabilmente vedrai + negli URL nella stringa di query dopo un?" È un eufemismo. Non dovresti mai vedere "+" nella parte del percorso dell'URL perché non farà ciò che ti aspetti (spazio).
Adam Gent,

34
Quindi in sostanza: l'obiettivo della presentazione GET è http://www.bing.com/search?q=hello+worlde una risorsa con spazio nel nomehttp://camera.phor.net/cameralife/folders/2012/2012-06%20Pool%20party/
William Entriken

8
Si noti che per i collegamenti e-mail, è necessario% 20 e non + dopo il?. Ad esempio mailto:support@example.org?subject=I%20need%20help,. Se l'hai provato con +, l'e-mail si aprirà con + es anziché con spazi.
Sygmoral,

288

Questa confusione è perché gli URL sono ancora 'rotti' fino ad oggi.

Prendi " http://www.google.com " per esempio. Questo è un URL Un URL è un localizzatore di risorse uniforme ed è in realtà un puntatore a una pagina Web (nella maggior parte dei casi). Gli URL hanno in realtà una struttura molto ben definita dalla prima specifica nel 1994.

Possiamo estrarre informazioni dettagliate sull'URL " http://www.google.com ":

+---------------+-------------------+
|      Part     |      Data         |
+---------------+-------------------+
|  Scheme       | http              |
|  Host         | www.google.com    |
+---------------+-------------------+

Se osserviamo un URL più complesso come:

" https: // bob: bobby@www.lunatech.com: 8080 / file; p = 1? q = 2 # third "

possiamo estrarre le seguenti informazioni:

+-------------------+---------------------+
|        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

I caratteri riservati sono diversi per ogni parte.

Per gli URL HTTP, uno spazio in una parte del frammento del percorso deve essere codificato in "% 20" (non, assolutamente non "+"), mentre il carattere "+" nella parte del frammento del percorso può essere lasciato non codificato.

Ora nella parte della query, gli spazi possono essere codificati in "+" (per compatibilità con le versioni precedenti: non tentare di cercarlo nello standard URI) o "% 20" mentre il carattere "+" (come risultato di questa ambiguità ) deve essere convertito in "% 2B".

Ciò significa che la stringa "blu + azzurro" deve essere codificata in modo diverso nelle parti del percorso e della query:

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

Da lì puoi dedurre che la codifica di un URL completamente costruito è impossibile senza una consapevolezza sintattica della struttura dell'URL.

Questo si riduce a:

Dovresti avere %20prima ?e +dopo.

fonte


>> dovresti avere% 20 prima del? e + dopo Ci scusiamo per la domanda stupida. So in qualche modo che il parametro hashtag viene utilizzato dopo "?" parametro del punto interrogativo. Anche se è in qualche modo diverso perché l'uso di "#" non ricarica la pagina. Ma ho provato a usare il segno% 20 e + dopo l'hashtag "#" e sembra non funzionare. Quale deve essere usato dopo "#"?
Philcyb,

@Philcyb Potresti voler leggere questo en.wikipedia.org/wiki/Percent-encoding
Matas Vaitkevicius il

La parte della query ha effettivamente uno standard "ufficiale"? In sostanza, ho pensato che quella parte fosse specifica dell'applicazione. Il 99,99% delle app utilizza la key1=value1&key1=value2codifica di chiavi e valori con qualunque regola encodeURIComponentsegua, ma AFAIK il contenuto della parte della query è completamente al 100% fino all'app. A parte questo, si passa solo al primo #non esiste una codifica ufficiale.
Gman,

Una risposta duplicata per la domanda duplicata! Ma hmm, ok, ho rinunciato a entrambi.
Vladimir Vukanac il

3
L'etichettatura dei componenti ASCII è epica.
jsejcksn,

25

Lo consiglierei %20.

Li stai codificando?

Tuttavia, ciò non è molto coerente tra le lingue. Se non sbaglio, in PHP urlencode()tratta gli spazi come +mentre Python urlencode()li tratta come %20.

MODIFICARE:

Sembra che mi sbagli. Python's urlencode()(almeno in 2.7.2) utilizza quote_plus()invece di quote()e quindi codifica gli spazi come "+". Sembra anche che la raccomandazione del W3C sia il "+" come qui: http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1

E in effetti, puoi seguire questo interessante dibattito sul tracker dei problemi di Python su cosa usare per codificare gli spazi: http://bugs.python.org/issue13866 .

EDIT # 2:

Capisco che il modo più comune di codificare "" è come "+", ma solo una nota, potrei essere solo io, ma lo trovo un po 'confuso:

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

>>> '+=%2B+'

Non hardcoding. Sto cercando di determinare da un punto di vista estetico come appariranno i miei URL contenenti spazi.
BC.

Ciao, sono anche confuso, quando l'utente invia il modulo HTML, come il modulo codifica lo spazio? con quale personaggio? Il risultato dipende dal browser?
GMsoF,

1
E anche il URLEncoder.encode()metodo in Java lo converte +.
рüффп,

E poi sorge la domanda su come trattare la codifica nel corpo di una richiesta POST: "Content-Type: application / x-www-form-urlencoded" dove i parametri sono nella forma di "a = b & c = d", ma non sono affatto in un URL, solo il corpo del "documento". Hanno creato un vero pasticcio per questo problema ed è difficile trovare risposte definitive.
fyngyrz,

Perls uri_escape () li tratta come% 20
utente

16

Uno spazio può essere codificato solo su "+" nelle coppie chiave-valore del tipo di contenuto "application / x-www-form-urlencoded" che interrogano parte di un URL. Secondo me, questo è un MAGGIO, non un DEVE. Nel resto degli URL, è codificato come% 20.

A mio avviso, è meglio codificare sempre gli spazi come% 20, non come "+", anche nella parte della query di un URL, poiché è la specifica HTML (RFC-1866) che ha specificato che i caratteri dello spazio devono essere codificati come " + "in" coppie chiave-valore del tipo di contenuto "application / x-www-form-urlencoded" (vedere paragrafo 8.2.1. comma 1.)

Questo modo di codificare i dati dei moduli è indicato anche nelle specifiche HTML successive. Ad esempio, cerca i paragrafi pertinenti su application / x-www-form-urlencoded in HTML 4.01 Specification e così via.

Ecco una stringa di esempio nell'URL in cui la specifica HTML consente di codificare gli spazi come vantaggi: " http://esempio.com/over/there?name=foo+bar ". Quindi, solo dopo "?", Gli spazi possono essere sostituiti da vantaggi . In altri casi, gli spazi devono essere codificati in% 20. Tuttavia, poiché è difficile determinare correttamente il contesto, è consigliabile non codificare mai gli spazi come "+".

Consiglierei di codificare in percentuale tutti i caratteri tranne "senza prenotazione" definito in RFC-3986, p. 2.3

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

L'implementazione dipende dal linguaggio di programmazione che hai scelto.

Se il tuo URL contiene caratteri nazionali, prima codificali in UTF-8, quindi codifica in percentuale il risultato.


1
Perché qualcuno dovrebbe preoccuparsi delle specifiche HTML se la risorsa richiesta non è HTML? Ho visto "+" in alcune API Web che non rispondono con HTML, ad es. Richiedi un pdf. Ritengo sbagliato che non utilizzino "% 20".
L'incredibile gennaio

@TheincredibleJan, sono d'accordo con te. Ecco di cosa parla la mia risposta.
Maxim Masiutin,

1
@MaximMasiutin Quando la tua risposta dice "Questo è un MAGGIO, non un DEVE", a quali specifiche ti riferisci? Sto lottando per trovare una specifica che lo abbia come un maggio. In w3.org/TR/1999/REC-html401-19991224/interact/… utilizzando '+' (nella sezione query) è all'interno di una sezione 'must' della specifica.
JosephH

2
@JosephH - grazie per la tua nota. È la mia opinione persionale su MAGGIO. Ho modificato il post. Quello che volevo dire è che la specifica HTML che hai definito definisce "+", ma nel contesto dell'URL, si applicano altre regole, che consentono anche di codificare spazi come% 20.
Maxim Masiutin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.