在Mathematica中如何对字符串进行URL转义?

5
例如,
urlesc["foo.cgi?abc=123"]

应该返回
foo.cgi%3Fabc%3D123

这也被称为百分号编码

另外,为了更好的可读性,空格应该编码为加号。 我相信对于URL转义来说这总是可以接受的。


收藏。这是我每六个月想做一次的事情,我总是最终重新开始排序来完成任务。 - Pillsy
2个回答

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
两个答案都值得点赞,但如果这是我的问题,我会接受这个答案,因为通过JLink可以获得很多有用的东西,而我总是忘记了。 - Pillsy

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接