Например,
urlesc["foo.cgi?abc=123"]
должен возвратиться
foo.cgi%3Fabc%3D123
Это также известно как кодирование процента.
Кроме того, для лучшей удобочитаемости пробелы должны закодировать к плюсам. Я полагаю, что это всегда приемлемо для выхода URL.
Другой метод, использующий J / Link и java.net.URLEncoder
:
In[116]:= Needs["JLink`"]; InstallJava[];
LoadJavaClass["java.net.URLEncoder"];
In[118]:= URLEncoder`encode["foo.cgi?abc=123"]
Out[118]= "foo.cgi%3Fabc%3D123"
Также существует java.net.URLDecoder
для декодирования.
Вот мое решение:
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, "&"]