Hlavní obsah
Internet, technologie a elektronika

Proč se mezera v URL mění na %20. Dvě hexadecimální číslice zapisují jeden bajt

Foto: Pexels

%20 není tajný kód pro mezeru vytvořený prohlížečem náhodou. Jde o percent-encoding: znak % následovaný dvěma hexadecimálními číslicemi zapisuje hodnotu jednoho bajtu.

Č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

Máte na tohle téma jiný názor? Napište o něm vlastní článek.

Texty jsou tvořeny uživateli a nepodléhají procesu korektury. Pokud najdete chybu nebo nepřesnost, prosíme, pošlete nám ji na medium.chyby@firma.seznam.cz.

Související témata:

Sdílejte s lidmi své příběhy

Stačí mít účet na Seznamu a můžete začít publikovat svůj obsah. To nejlepší se může zobrazit i na hlavní stránce Seznam.cz