Quando codificare lo spazio in più (+) o% 20?


Risposte:


481

+indica uno spazio solo nel application/x-www-form-urlencodedcontenuto, ad esempio la parte della query di un URL:

http://www.example.com/path/foo+bar/path?query+name=query+value

In questo URL, il nome del parametro è query namecon uno spazio e il valore è query valuecon uno spazio, ma il nome della cartella nel percorso è letteralmente foo+bar, non è foo bar .

%20è un modo valido per codificare uno spazio in uno di questi contesti. Quindi, se è necessario codificare l'URL di una stringa per l'inclusione in parte di un URL, è sempre sicuro sostituire gli spazi con %20e i vantaggi con %2B. Questo è ciò che es. encodeURIComponent()fa in JavaScript. Sfortunatamente non è quello che fa urlencode in PHP ( rawurlencode è più sicuro).

Vedi anche HTML 4.01 Specifica application / x-www-form-urlencoded


5
sono davvero confuso, la mia domanda è, quando il browser fa la prima forma e quando la seconda?
Muhammad Hewedy,

11
Il browser creerà un query+name=query+valueparametro da un modulo con <input name="query name" value="query value">. Non verrà creato query%20nameda un modulo, ma è assolutamente sicuro utilizzarlo invece, ad es. se stai mettendo insieme un modulo per un XMLHttpRequest. Se hai un URL con uno spazio al suo interno, ad esempio <a href="http://www.example.com/foo bar/">, il browser lo codificherà per consentirti %20di correggere l'errore, ma probabilmente è meglio non fare affidamento.
bobince

6
che funzione su JavaScript make foo bara foo+bar?
Sisir,

21
@Sisir: non esiste una funzione JS che esegua la codifica del modulo URL. Puoi fare naturalmente encodeURIComponent(s).replace(/%20/g, '+')se ne hai davvero bisogno+
bobince

2
Questo è un esempio molto, molto confuso di qualcosa che è codificato in forma. Non ha nulla a che fare con gli URL.
Dave Van den Eynde,

54

http://www.example.com/some/path/to/resource?param1=value1

La parte prima del punto interrogativo deve utilizzare la codifica% (quindi %20per lo spazio), dopo il punto interrogativo è possibile utilizzare uno %20o +per uno spazio. Se hai bisogno di un effettivo +dopo il punto interrogativo, usa %2B.


6
@DaveVandenEynde Perché no?
cerberos,

10
perché è sbagliato. Fa parte del vecchio tipo di media application / x-www-form-urlencoded che non si applica agli URL. Inoltre, decodeURIComponentnon lo decodifica.
Dave Van den Eynde,

3
Sì, probabilmente è stato copiato da RFC 1630 e non è mai stato uno standard. tools.ietf.org/html/rfc3986 è lo standard (aggiornato di nuovo per IPv6 o qualcosa del genere). Sicuramente i browser lo "supportano" ancora, ma cosa significa? È il codice server o client che legge la stringa di query e la decodifica, non il browser. Il browser lo passa semplicemente avanti e indietro e poiché +è un carattere riservato , verrà conservato dal browser.
Dave Van den Eynde,

18
Google utilizza + per gli spazi nei suoi URL di ricerca ( google.com/#q=perl+equivalent+to+php+urlencode+spaces+as+%2B ).
Giustino,

2
A proposito: Rails decodifica anche gli spazi con +per impostazione predefinita ( { foo: 'bar bar'}.to_query=> foo=bar+bar)
wrtsprt

46

Quindi, le risposte qui sono tutte un po 'incomplete. L'uso di '% 20' per codificare uno spazio negli URL è esplicitamente definito in RFC3986 , che definisce come viene costruito un URI. In questa specifica non viene menzionato l'utilizzo di un '+' per la codifica degli spazi: se si utilizza esclusivamente questa specifica, uno spazio deve essere codificato come '% 20'.

La menzione dell'uso di "+" per la codifica degli spazi deriva dalle varie incarnazioni della specifica HTML, in particolare nella sezione che descrive il tipo di contenuto "application / x-www-form-urlencoded". Viene utilizzato per la pubblicazione dei dati dei moduli.

Ora, la specifica HTML 2.0 (RFC1866) ha esplicitamente affermato, nella sezione 8.2.2, che la parte Query della stringa URL di una richiesta GET deve essere codificata come 'application / x-www-form-urlencoded'. Questo, in teoria, suggerisce che è legale usare un '+' nell'URL nella stringa di query (dopo il '?').

Ma ... lo fa davvero? Ricorda, l'HTML è esso stesso una specifica del contenuto e gli URL con stringhe di query possono essere utilizzati con contenuti diversi dall'HTML. Inoltre, mentre le versioni successive delle specifiche HTML continuano a definire '+' come legale nel contenuto 'application / x-www-form-urlencoded', omettono completamente la parte dicendo che le stringhe di query di richiesta GET sono definite come quel tipo. In effetti, non vi è alcun riferimento alla codifica della stringa di query in qualsiasi cosa dopo le specifiche HTML 2.0.

Ciò che ci lascia con la domanda: è valido? Certamente c'è MOLTO codice legacy che supporta '+' nelle stringhe di query e molto codice che lo genera anche. Quindi le probabilità sono buone che non si romperanno se si utilizza '+'. (E, di fatto, ho fatto tutte le ricerche su questo recentemente perché ho scoperto un sito principale che non è riuscito ad accettare '% 20' in una query GET come spazio. In realtà non sono riusciti a decodificare QUALSIASI carattere con codifica percentuale. Quindi il servizio anche il riutilizzo può essere rilevante.)

Ma da una pura lettura delle specifiche, senza il linguaggio dalla specifica HTML 2.0 trasferito nelle versioni successive, gli URL sono interamente coperti da RFC3986, il che significa che gli spazi dovrebbero essere convertiti in '% 20'. E sicuramente questo dovrebbe essere il caso se stai richiedendo qualcosa di diverso da un documento HTML.


Per aggiungere alla tua risposta, Chrome per impostazione predefinita codifica gli spazi negli URL come %20( <a href="?q=a b">), ma quando si invia un modulo, utilizza il +segno. Puoi sovrascriverlo utilizzando esplicitamente il +segno ( <a href="?q=a+b">) o inviando il modulo utilizzando XMLHTTPRequest.
x-yuri,

È davvero difficile capire lo scopo dell'aggiunta di URLSearchParams developers.google.com/web/updates/2016/01/urlsearchparams , che funziona in qualche modo precedente (serializzare SPACE in '+'). Non è nemmeno supportato in IE11!
Ninfetamina,

9

È meglio codificare sempre gli spazi come% 20, non come "+".

Era RFC-1866 (specifica HTML 2.0), che specificava che i caratteri dello spazio dovevano essere codificati come "+" nelle coppie chiave-valore del tipo di contenuto "application / x-www-form-urlencoded". (vedi paragrafo 8.2.1. comma 1.). Questo modo di codificare i dati dei moduli viene anche fornito nelle specifiche HTML successive, cerca i paragrafi pertinenti su application / x-www-form-urlencoded.

Ecco un esempio di tale stringa nell'URL in cui RFC-1866 consente la codifica di spazi come vantaggi: "http://example.com/over/there?name=foo+bar". Quindi, solo dopo "?", Gli spazi possono essere sostituiti da vantaggi, secondo RFC-1866. In altri casi, gli spazi devono essere codificati in% 20. Ma poiché è difficile determinare il contesto, è la migliore pratica 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 / "-" / "." / "_" / "~"

1
In .Net Framework UrlEncode utilizza '+' in QueryString, ma nel moderno .Net Core% 20 viene utilizzato
Michael Freidgeim,

@ MiFreidgeimSO-stopbeingevil Grazie per averci fatto sapere. Sembra che il moderno .Net Core abbia deciso di essere più coerente e compatibile.
Maxim Masiutin,

2

Qual è la differenza: vedi altre risposte.

Quando usare +invece di %20? Utilizzare +se, per qualche motivo, si desidera rendere più leggibile la stringa di query dell'URL ( ?.....) o il frammento di hash ( #....). Esempio: puoi effettivamente leggere questo:

https://www.google.se/#q=google+doesn%27t+encode+:+and+uses+%2B+instead+of+spaces ( %2B= +)

Ma è molto più difficile leggere quanto segue: (almeno per me)

https://www.google.se/#q=google%20doesn%27t%20oops%20:%20%20this%20text%20%2B%20is%20different%20spaces

Penso che +sia improbabile che rompa qualcosa, dal momento che Google utilizza +(vedi il primo link sopra) e probabilmente ci hanno pensato. Mi userò +solo perché leggibile + Google pensa che sia OK.


7
Dico che l'argomento "leggibilità" è la miglior difesa per "+". L'argomento "google do it" è fallace en.wikipedia.org/wiki/Argument_from_authority
FlipMcF

2
@FlipMcF La fallace discussione su Wikipedia della pagina dell'autorità riguarda "quando un'autorità viene citata su un argomento al di fuori della propria area di competenza o quando l'autorità citata non è un vero esperto " - Penso, tuttavia, che computer, HTTP e URL la codifica rientra nell'area di competenza di Google.
KajMagnus,

3
@FlipMcF Citando il comportamento di Google, in questo caso, è un argomento valido per usare "+" negli URL. Non è che google sia un'autorità, ma che google è probabilmente la più grande azienda di internet e se fanno qualcosa in qualche modo, è altamente improbabile che i browser un giorno decideranno di smettere di supportare questa pratica. Inoltre, Google Chrome è uno dei browser con la più alta condivisione e supporterà tutto ciò che Google vuole. Tutto sommato, direi che nessuno usando "+" invece di "% 20" avrà difficoltà a causa di ciò nel prossimo futuro.
jdferreira,

Mi piacerebbe continuare questo argomento da qualche altra parte, dove c'è un appello alla popolarità che rifiuta di riconoscere un appello all'autorità. Almeno possiamo essere tutti d'accordo su una cosa: '+' è superiore a '% 20'
FlipMcF

1
In realtà l'URL con% 20 è molto più facile da leggere perché i browser (desktop) mostrano l'URL decodificato nella parte inferiore della finestra se si sposta il cursore del mouse sul collegamento. I segni più vengono visualizzati invariati.
Martin,
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.