代码之家  ›  专栏  ›  技术社区  ›  dreeves

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

  •  5
  • dreeves  · 技术社区  · 15 年前

    例如,

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

    应该返回

    foo.cgi%3Fabc%3D123
    

    这也被称为 percent-encoding .

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

    2 回复  |  直到 11 年前
        1
  •  6
  •   Michael Pilat    15 年前

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

        2
  •  4
  •   dreeves    11 年前

    我的解决方案是:

    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} 获取参数,例如 a=2&b=3 ,使用适当的URL编码:

    encode[c_] := cat @@ Riffle[cat[#1, "=", urlesc[#2]]& @@@ c, "&"]