例如,
urlesc["foo.cgi?abc=123"]
应该返回
foo.cgi%3Fabc%3D123
这也称为percent-encoding。
此外,为了更好的可读性,空格应编码为加号。 我相信URL转义总是可以接受的。
答案 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, "&"]