如何URL转义Mathematica中的字符串?

时间:2010-07-01 19:11:05

标签: url escaping wolfram-mathematica

例如,

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

应该返回

foo.cgi%3Fabc%3D123

这也称为percent-encoding

此外,为了更好的可读性,空格应编码为加号。 我相信URL转义总是可以接受的。

2 个答案:

答案 0 :(得分:6)

另一种方法,使用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用于解码。

答案 1 :(得分:4)

这是我的解决方案:

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