【问题标题】:C# alternative for javascript escape functionjavascript 转义函数的 C# 替代方案
【发布时间】:2010-03-23 12:59:49
【问题描述】:

什么是 c# 中 javascript 转义函数的替代方法,例如假设一个字符串:“Hi Foster's i'm missing /you”如果我们会给出“Hi%20Foster%27s%20i%27m%20missing%20/you”使用 javascript 转义函数,但 c# 的替代方法是什么。我已经搜索过了,但没有用。

【问题讨论】:

  • 伙计们,我已经测试了followin',但它们都没有替换单引号“'”。 Uri.EscapeDataString("some text") Uri.EscapeUriString("some text") System.Web.HttpUtility.UrlEncode("some text") System.Web.HttpUtility.UrlPathEncode("some thext")

标签: asp.net


【解决方案1】:

你可以使用:

string encoded = HttpUtility.JavaScriptStringEncode(str);

注意:您至少需要 ASP.NET 4.0 才能运行上述代码。

【讨论】:

    【解决方案2】:

    我在这个博客上提到了我见过的最佳解决方案 - Kaushik Chakraborti 的 C#: Equivalent of JavaScript escape function。转义 javascript 不仅仅是 url 编码或用实体替换空格。

    【讨论】:

    • +1 是的,escape 函数是一种独特的野兽,而 URLEncode 的行为根本不一样。
    • 在我发布的答案中,我包含了 Reflector 中用于此功能的代码
    • escape 功能确实是一头独特的野兽,这是不使用它的好理由;标准的 URL 编码(JavaScript 中的encodeURIComponent)通常是更合适的做法。实际用例是什么?
    • @OskarKjellin 我已经修复了断开的链接,将其指向新站点。
    【解决方案3】:
    var unescapedString = Microsoft.JScript.GlobalObject.unescape(yourEscapedString);
    
    var escapedString = Microsoft.JScript.GlobalObject.escape(yourUnescapedString);
    

    【讨论】:

      【解决方案4】:

      以下是您将在 Microsoft.JScript.dll 中找到的 escape 函数实现...

      [NotRecommended("escape"), JSFunction(JSFunctionAttributeEnum.None, JSBuiltin.Global_escape)]
      public static string escape(string str)
      {
          string str2 = "0123456789ABCDEF";
          int length = str.Length;
          StringBuilder builder = new StringBuilder(length * 2);
          int num3 = -1;
          while (++num3 < length)
          {
              char ch = str[num3];
              int num2 = ch;
              if ((((0x41 > num2) || (num2 > 90)) &&
                   ((0x61 > num2) || (num2 > 0x7a))) &&
                   ((0x30 > num2) || (num2 > 0x39)))
              {
                  switch (ch)
                  {
                      case '@':
                      case '*':
                      case '_':
                      case '+':
                      case '-':
                      case '.':
                      case '/':
                          goto Label_0125;
                  }
                  builder.Append('%');
                  if (num2 < 0x100)
                  {
                      builder.Append(str2[num2 / 0x10]);
                      ch = str2[num2 % 0x10];
                  }
                  else
                  {
                      builder.Append('u');
                      builder.Append(str2[(num2 >> 12) % 0x10]);
                      builder.Append(str2[(num2 >> 8) % 0x10]);
                      builder.Append(str2[(num2 >> 4) % 0x10]);
                      ch = str2[num2 % 0x10];
                  }
              }
          Label_0125:
              builder.Append(ch);
          }
          return builder.ToString();
      }
      

      代码取自 Reflector。

      【讨论】:

        【解决方案5】:

        此博客中提到了我见过的最佳解决方案 - C#: Equivalent of JavaScript escape function by Kaushik Chakraborti。转义 javascript 不仅仅是 url 编码或用实体替换空格。

        我注意到 KodeSharp 文章中的 cmets 中的另一个解决方案可能更好。评论说它与 UTF-8 更兼容,不需要引用 JScript。这是否更好?

        (依赖于 System.Web.Extensions.dll)

        using System.Web.Script.Serialization;
        JavaScriptSerializer serialiser = new JavaScriptSerializer();
        serialiser.Serialize("some \"string\"")
        

        【讨论】:

        • 我试过这个解决方案,但 Javascript unescape 没有“反序列化”它。我必须把它扔进 Reflector 看看它到底做了什么。
        【解决方案6】:
        string myString = "Hello my friend";
        myString = myString.Replace(" ", "%20");
        

        这会将所有“”替换为“%20”。

        这是你想要的吗?

        【讨论】:

          【解决方案7】:

          你可以试试这个

          Uri.EscapeDataString(Obj);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-05-28
            • 1970-01-01
            • 1970-01-01
            • 2015-08-25
            • 2023-04-08
            • 1970-01-01
            • 2021-04-16
            • 1970-01-01
            相关资源
            最近更新 更多