urlQuote

Vráti text zakódovaný pro přenos v URL (escape sekvence %XX).

String urlQuote ( 
    String str [ , 
    String encoding ]
)
str
Řetězec k zakódování.
encoding
Název kódování.
Příklad: Funkce urlQuote
Vstup
{urlQuote("žena a muž")}
Výstup
%C5%BEena+a+mu%C5%BE

Výstup je v uvedeném příkladu v kódování UTF-8. Obecně může defaultní kódování záviset na konfiguraci.

Kdy funkci nepoužít

Použití funkce je zbytečné (a vedlo by k chybám) v konstrukcích, které slouží výhradně pro generování parametrů URL:

Co funkce nedokáže

Funkci není možné použít k opravě chybně sestaveného řetězce s parametry URL. Toto je věc, která fakticky není spolehlivě řešitelná žádným algoritmem: zakódovat se jména parametrů a jejich hodnoty musejí ještě před sestavením řetězce.

Příklad: Sestavení řetězce s parametry URL
Špatně
{let queryString := asString(name, "=", value)}
{/*
  Pokud name nebo value obsahuje "=" nebo "&",
  pak není možné queryString rozložit jednoznačným
  způsobem.
*/}
Správně
{let queryString := asString(urlQuote(name), "=", urlQuote(value))}

Funkce urlQuote odpovídá funkci javascriptu encodeURIComponent. (Javascript má ještě navíc funkci encodeURI, která může částečně „opravit“ chybně sestavené URI, ale úplně spolehlivá není a být nemůže.)

Co je dobré vědět

Přenos znaků s diakritikou v URL je poměrně značně náchylný k různým chybám. Je to dané tím, že sekvence "%XX" v URL nekódují přímo znaky, ale sekvence bytů, které znaky reprezentují v tom kterém kódování.

Proto výsledek zakódování obecně závisí na zvoleném kódování; a to je také důvod, proč funkce může dostat na vstupu zadané kódování.

Příklad: Funkce urlQuote a kódování
Vstup
{urlQuote("žena a muž", "UTF-8")}
{urlQuote("žena a muž", "Windows-1250")}
Výstup
%C5%BEena+a+mu%C5%BE
%9Eena+a+mu%9E

Znak "ž" je v kódování Windows-1250 reprezentovaný jedním bytem: 0xE9 hexadecimálně.

V kódování UTF-8 máme sekvenci dvou bytů: 0xC5 a 0xBE. Toto je v UTF-8 reprezentace znaku s kódem 0x17E, tedy "LATIN SMALL LETTER Z WITH CARON" podle Unicode.

Způsob zpracování takto zakódovaných parametrů na straně serveru závisí na jeho nastavení. Zejména v případě, kdy nemáme nastavení cílového serveru odkazu pod kontrolou, tedy není možné garantovat, že hodnoty parametrů URL budou vždy v budoucnu interpretovány stejně.

Pro vložení příspěvku do diskuse se přihlašte.