Cosa fa il percent-encoding
Un URL può contenere solo un insieme limitato di caratteri ASCII, e alcuni di questi (/, ?, &, =, #) hanno un significato strutturale. Qualsiasi altro byte viene scritto come segno di percentuale e due cifre hex: uno spazio è %20, & è %26, e i byte UTF-8 di é sono %C3%A9. Le regole sono definite da RFC 3986.
Tre modalità, perché il contesto conta
| Modalità | Codifica | Mantiene | Da usare quando |
|---|---|---|---|
| Componente di query | Tutto tranne A–Z a–z 0–9 - _ . ~ | Solo i caratteri non riservati | Inserisci un valore in un parametro di query o in un segmento di percorso: ?q=…. Equivale a encodeURIComponent. |
| URL intero | Spazi, non-ASCII, virgolette, < >… | : / ? # [ ] @ & = + $ , ; | Ripulisci un URL completo senza romperne la struttura. Equivale a encodeURI. |
| Dati di form | Come componente, ma lo spazio diventa + | Corpi dei form HTML (application/x-www-form-urlencoded), che è ciò che la maggior parte delle librerie HTTP invia di default. |
L’errore più comune è usare la codifica da URL intero su un valore che contiene & o =: il server divide il parametro in due. Codifica i valori con le regole da componente e uniscili solo dopo.
Segni più
Nel corpo di un form (e, per convenzione, nella query string) + significa spazio, quindi decodificando dati di form bisogna trasformare + in spazio, mentre un più letterale deve essere stato inviato come %2B. In un percorso, + è semplicemente un più. L’interruttore Decodifica + come spazio copre entrambe le situazioni.
Doppia codifica
Se vedi %2520 in un URL, qualcosa ha codificato una stringa già codificata: %20 è stato trattato come testo e il suo % è diventato %25. Decodifica due volte per recuperare l’originale, poi correggi il codice che ha codificato due volte.
Domande
Cos’è %20?
Uno spazio. 0x20 è il codice ASCII dello spazio, quindi il percent-encoding lo scrive come %20. Nei dati di form può comparire come + invece.
Che differenza c’è tra encodeURI ed encodeURIComponent?
encodeURIComponent codifica ogni carattere che potrebbe essere strutturale (compresi /, ?, & e =) ed è per singoli valori. encodeURI li lascia intatti perché un URL intero resti un URL. Usa la modalità Componente di query per il primo, URL intero per il secondo.
Come vengono codificati i caratteri non inglesi?
Come i byte della loro forma UTF-8, ognuno scritto come %XX. é sono due byte (%C3%A9), 日 sono tre (%E6%97%A5). I sistemi più vecchi a volte usavano Latin-1, che dà %E9 per é; browser e API moderni usano UTF-8.
Perché la decodifica fallisce sulla mia stringa?
O un % non è seguito da due cifre hex (un segno di percentuale isolato va scritto come %25), oppure i byte codificati non formano UTF-8 valido. Il messaggio di errore dice quale dei due.
Devo codificare l’intero URL o solo i parametri?
Solo i parametri (e qualsiasi segmento di percorso che contiene testo dell’utente). Costruisci l’URL da pezzi già codificati, così i delimitatori restano non codificati.