Článek
V odkazu stačí jediná mezera a najednou se z ní může stát trojice znaků %20. Vypadá to jako zvláštní zkratka, ale princip je přesný: URL potřebují způsob, jak zapsat bajty, které se na daném místě nemají nebo nemohou objevit přímo. K tomu slouží percent-encoding.
RFC 3986 popisuje percent-encoded bajt jako znak procenta následovaný dvěma hexadecimálními číslicemi. Hodnota mezery v ASCII je 0×20. Proto se bajt reprezentující mezeru zapíše jako %20.
Procento říká: další dvě číslice čti šestnáctkově
Hexadecimální soustava používá číslice 0–9 a písmena A–F. Dvojice 20 tedy není desetinné číslo dvacet napsané do URL jen z estetických důvodů. Je to šestnáctkový zápis hodnoty bajtu. RFC uvádí %20 přímo jako příklad percent-encodingu pro znak mezery.
Stejným způsobem lze zapsat i další bajty. Samotný znak procenta má v ASCII hodnotu 0×25, takže pokud se má procento objevit jako data, může se zapsat jako %25.
U češtiny jeden znak často znamená několik %XX
U ASCII je příklad jednoduchý, protože jeden znak odpovídá jednomu bajtu. U znaků mimo ASCII se dnešní URL běžně opírají o UTF-8. Jeden český znak může v UTF-8 tvořit více bajtů a každý z nich se pak zapíše vlastním %XX.
WHATWG URL Standard například ukazuje UTF-8 percent-encoding znaků do sekvencí více percent-encoded bajtů. To je důvod, proč může URL s diakritikou po zakódování výrazně narůst.
A proč někdy místo %20 vidím plus?
Tady vzniká častý zmatek. Plus není obecná náhrada mezery ve všech částech URL. Formát application/x-www-form-urlencoded, historicky spojený s HTML formuláři a dnes používaný například URLSearchParams, má zvláštní pravidlo: mezeru může při serializaci zapisovat jako +.
WHATWG URL Standard tuto výjimku popisuje přímo. Při zpracování application/x-www-form-urlencoded se plus naopak při parsování převádí zpět na mezeru. Proto mohou dvě zdánlivě podobné adresy nebo query stringy používat pro mezeru odlišný zápis.
%20 je technický zápis, ne šifra
Když tedy v URL zahlédnu %20, neznamená to, že stránka je rozbitá nebo že prohlížeč něco tajně zašifroval. Vidím jen textovou reprezentaci jednoho bajtu: procento oznamuje percent-encoding a 20 je jeho hexadecimální hodnota.
Až na drobné detaily různých částí URL a formulářového kódování je hlavní myšlenka jednoduchá: URL potřebuje bezpečně přenést data v omezené znakové podobě. Percent-encoding je jeden ze základních mechanismů, jak to udělat.
Zdroje a prameny
• RFC Editor – RFC 3986, část 2.1 Percent-Encoding — otevřít zdroj — definuje zápis % + dvě hexadecimální číslice a uvádí %20 jako ASCII mezeru
• WHATWG – URL Living Standard — otevřít zdroj — popisuje percent-encoded bytes, UTF-8 percent-encoding a zvláštní zacházení s mezerou jako + ve formátu application/x-www-form-urlencoded






