FAQ5 min di lettura

Codificare gli spazi negli URL: %20 vs + (quando usare l'uno o l'altro)

%20 è la percent-encoding standard RFC 3986 per il carattere di spazio e dovrebbe essere usata nei percorsi degli URL e nella maggior parte dei contesti. Il segno + rappresenta uno spazio solo nel formato application/x-www-form-urlencoded, utilizzato nell'invio dei form HTML e in alcune query string.

Cosa significa %20?

%20 è la rappresentazione percent-encoded del carattere di spazio (codice ASCII 32, esadecimale 0x20) così come definito da RFC 3986. È il modo standard per rappresentare gli spazi in qualsiasi parte di un URI, inclusi i segmenti del percorso, le query string e gli identificatori di frammento.

Quando vedi %20 in un URL, significa semplicemente "qui c'è uno spazio". Ad esempio, https://example.com/my%20file.pdf fa riferimento a una risorsa chiamata "my file.pdf". Il %20 è interpretato universalmente da tutti i web server, i browser e le librerie HTTP.

Cosa significa + in un URL?

Il segno + che rappresenta uno spazio deriva dal content type application/x-www-form-urlencoded, definito nella specifica HTML per la codifica dei dati dei form. Quando un form HTML viene inviato con il metodo GET, il browser codifica gli spazi come + nella query string risultante.

Ad esempio, se digiti "hello world" in un form di ricerca e lo invii, il browser genera un URL come https://example.com/search?q=hello+world. Qui il + significa "spazio", ma solo perché la query string sta usando il formato form-urlencoded.

È importante notare che + non ha alcun significato speciale al di fuori del formato application/x-www-form-urlencoded. In un percorso di URL come /files/my+file.pdf, il + è un segno più letterale, non uno spazio. Il file a cui si fa riferimento si chiama letteralmente "my+file.pdf".

La differenza fondamentale

La differenza sostanziale sta nella specifica a cui ciascuno appartiene. %20 è definito da RFC 3986 (URI) e funziona ovunque in un URL. La convenzione del + come spazio è definita dalla specifica HTML/WHATWG per i dati dei form e funziona solo nelle query string che vengono esplicitamente trattate come dati form-urlencoded.

  • %20 funziona nei percorsi, nelle query string, nei frammenti e in tutti i contesti URI
  • + significa "spazio" solo nelle query string application/x-www-form-urlencoded
  • Nei percorsi degli URL, + è un segno più letterale, non uno spazio
  • %20 è sempre sicuro; + dipende dal contesto
  • Se codifichi un + letterale nei dati di un form, diventa %2B

Quale dovresti usare?

Usa %20 quando costruisci URL a livello di codice, componi richieste REST API, codifichi segmenti di percorso o ogni volta che hai dei dubbi. È la codifica universalmente corretta per gli spazi negli URI.

Usa + solo quando stai producendo intenzionalmente dati application/x-www-form-urlencoded, come nel costruire query string che imitano l'invio di form HTML, oppure quando un'API richiede esplicitamente questo formato.

La maggior parte delle API e dei framework moderni accetta sia %20 sia + nelle query string. Tuttavia, usare %20 è più portabile ed evita ambiguità, soprattutto quando la query string potrebbe essere usata in contesti diversi dall'invio dei form.

Come i diversi linguaggi gestiscono gli spazi

I diversi linguaggi di programmazione e le loro librerie standard possono usare come impostazione predefinita %20 oppure + per codificare gli spazi. Conoscere il comportamento predefinito del tuo linguaggio ti aiuta a evitare sorprese.

// JavaScript
encodeURIComponent('hello world');  // "hello%20world" (%20)
new URLSearchParams({q: 'hello world'}).toString();  // "q=hello+world" (+)

// Per forzare %20 nelle query string:
new URLSearchParams({q: 'hello world'}).toString().replace(/\+/g, '%20');
# Python
from urllib.parse import quote, quote_plus, urlencode

quote('hello world', safe='')    # "hello%20world" (%20)
quote_plus('hello world')        # "hello+world" (+)
urlencode({'q': 'hello world'})  # "q=hello+world" (+ per impostazione predefinita)

# Per forzare %20:
urlencode({'q': 'hello world'}, quote_via=quote)  # "q=hello%20world"
// PHP
rawurlencode('hello world');  // "hello%20world" (%20)
urlencode('hello world');     // "hello+world" (+)

// rawurlencode segue RFC 3986
// urlencode segue application/x-www-form-urlencoded

Articoli correlati

Prova i nostri strumenti gratuiti