Как мне URL-экранировать строку в Mathematica? - PullRequest
5 голосов
/ 01 июля 2010

Например,

urlesc["foo.cgi?abc=123"]

должно возвращать

foo.cgi%3Fabc%3D123

Это также известно как процентное кодирование .

Также длялучше читаемость, пробелы должны кодироваться в плюсы.Я считаю, что это всегда приемлемо для экранирования URL.

Ответы [ 2 ]

6 голосов
/ 02 июля 2010

Другой метод, использующий 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 для декодирования.

4 голосов
/ 01 июля 2010

Вот мое решение:

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, "&"]
...