urlQuote
Vráti text zakódovaný pro přenos v URL (escape sekvence %XX).
StringurlQuote
(
String str [,
String encoding ])
- str
- Řetězec k zakódování.
- encoding
- Název kódování.
{urlQuote("žena a muž")}
%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:
- při výpisu identifikace stránky s parametry;
- v mapě parametrů předávané funkci linkTail.
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.
{let queryString := asString(name, "=", value)}
{/*
Pokud name nebo value obsahuje "=" nebo "&",
pak není možné queryString rozložit jednoznačným
způsobem.
*/}
{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í.
{urlQuote("žena a muž", "UTF-8")}
{urlQuote("žena a muž", "Windows-1250")}
%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ě.