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

Quando è uno spazio in un URL codificato in + e quando è codificato in %20 ?

Da Wikipedia (enfasi e link aggiunti):

Quando i dati inseriti nei moduli HTML vengono inviati, i nomi dei campi e i valori del modulo vengono codificati e inviati al server in un messaggio di richiesta HTTP utilizzando il metodo GET o POST o, storicamente, tramite e-mail. La codifica utilizzata per impostazione predefinita si basa su una versione molto precoce delle regole di codifica percentuale per URI generiche, con un numero di modifiche come la normalizzazione di 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 effettiva utilizza %20 mentre i dati modulo negli URL sono in una forma modificata che utilizza + . Quindi è più probabile che tu veda + solo negli URL nella stringa di query dopo un ? .

Questa confusione è dovuta al fatto che l’URL è ancora “rotto” fino ad oggi.

Prendi ” http://www.google.com ” per esempio. Questo è un URL. Un URL è un localizzatore di risorse uniformi 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 del 1994.

Possiamo estrarre informazioni dettagliate sull’URL ” http://www.google.com “:

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

Se guardiamo un URL più complesso come:

” https: // bob: [email protected]: 8080 / file; p = 1? q = 2 # terzo ”

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:[email protected]: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 di percorso deve essere codificato in “% 20” (non, assolutamente non “+”), mentre il carattere “+” nella parte del frammento di percorso può essere lasciato non codificato.

Ora nella parte della query, gli spazi possono essere codificati in “+” (per compatibilità all’indietro: non cercare 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 “blue + light blue” deve essere codificata in modo diverso nel percorso e query parti:

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

Da lì è ansible dedurre che la codifica di un URL completamente costruito è imansible senza una consapevolezza sintattica della struttura dell’URL.

Ciò a cui questo si riduce è:

Dovresti avere %20 prima del ? e + dopo.

fonte

Consiglierei %20 .

Li stai codificando?

Questo non è molto coerente tra le lingue, però. Se non sbaglio, in PHP urlencode() considera gli spazi come + mentre l’ urlencode() di Python li considera come %20 .

MODIFICARE:

Sembra che mi sbagli. L’ urlencode() di Python (almeno nella 2.7.2) usa quote_plus() invece di quote() e quindi codifica gli spazi come “+”. Sembra anche che la raccomandazione del W3C sia il “+” come da 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 .

MODIFICA # 2:

Capisco che il modo più comune di codifica “” sia come “+”, ma solo una nota, potrebbe essere solo io, ma trovo questo un po ‘confuso:

 import urllib print(urllib.urlencode({' ' : '+ '}) >>> '+=%2B+' 

Uno spazio può essere codificato su “+” nella parte di query coppie di valori-chiave “application / x-www-form-urlencoded” di un URL. Questo è un MAGGIO, non un MUST. Nel resto degli URL, è codificato come% 20.

A mio parere, è meglio codificare sempre gli spazi come% 20, non come “+”, anche nella parte di query di un URL, perché è la specifica HTML (RFC-1866) che specifica che i caratteri dello spazio devono essere codificati come ” + “in” application / x-www-form-urlencoded “coppie di valori-chiave di tipo contenuto. (vedere paragrafo 8.2.1, paragrafo 1.) Questo modo di codificare i dati del modulo viene anche fornito nelle specifiche HTML successive, ad esempio, cercare i paragrafi rilevanti su application / x-www-form-urlencoded nella specifica HTML 4.01 e così via .

Ecco una stringa di esempio in URL in cui le specifiche HTML consentono di codificare gli spazi come plus: ” http://example.com/over/there?name=foo+bar “. Quindi, solo dopo “?”, Gli spazi possono essere sostituiti da plus, in base alle specifiche HTML. In altri casi, gli spazi devono essere codificati su% 20. Ma poiché è difficile determinare correttamente il contesto, è consigliabile non codificare mai spazi come “+”.

Vorrei raccomandare di codificare in percentuale tutti i caratteri tranne “senza riserva” definiti 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, codificali prima su UTF-8 e poi codifica per cento il risultato.