Вот мое решение:
cat = StringJoin@@(ToString/@{##})&; (* Like sprintf/strout in C/C++. *)
re = RegularExpression;
hex = IntegerString[#,16]&; (* integer to hex, represented as a string *)
up = ToUpperCase;
asc = ToCharacterCode[#][[1]]&; (* character to ascii code *)
subst = StringReplace;
urlesc[s_String] := subst[s, {" "->"+", re@"[^\w\_\:\.]":>"%"<>up@hex@asc@"$0"}]
urlesc[x_] := urlesc@cat@x
unesc[s_String] := subst[s, re@"\\%(..)":>FromCharacterCode@FromDigits["$1",16]]
В качестве бонуса, вот функция для кодирования списка правил, таких как {a->2, b->3}
, в параметры GET, такие как a=2&b=3
, с соответствующей URL-кодировкой:
encode[c_] := cat @@ Riffle[cat[#1, "=", urlesc[#2]]& @@@ c, "&"]