【问题标题】:Does C# have an equivalent to JavaScript's encodeURIComponent()?C# 是否与 JavaScript 的 encodeURIComponent() 等效?
【发布时间】:2010-09-10 07:57:21
【问题描述】:

在 JavaScript 中:

encodeURIComponent("©√") == "%C2%A9%E2%88%9A"

是否有 C# 应用程序的等价物?为了转义我使用的 HTML 字符:

txtOut.Text = Regex.Replace(txtIn.Text, @"[\u0080-\uFFFF]",
    m => @"&#" + ((int)m.Value[0]).ToString() + ";");

但我不确定如何将匹配转换为 JS 使用的正确十六进制格式。例如这段代码:

txtOut.Text = Regex.Replace(txtIn.Text, @"[\u0080-\uFFFF]",
    m => @"%" + String.Format("{0:x}", ((int)m.Value[0])));

返回“%a9%221a" for "©√" 而不是 "%C2%A9%E2%88%9A"。看起来我需要将字符串拆分为字节或其他内容。

编辑:这是一个 Windows 应用程序,System.Web 中可用的唯一项目是:AspNetHostingPermissionAspNetHostingPermissionAttributeAspNetHostingPermissionLevel

【问题讨论】:

    标签: c# javascript .net windows encoding


    【解决方案1】:

    Uri.EscapeDataStringHttpUtility.UrlEncode 是转义作为 URL 一部分的字符串的正确方法。

    以字符串"Stack Overflow"为例:

    • HttpUtility.UrlEncode("Stack Overflow") --> "Stack+Overflow"

    • Uri.EscapeUriString("Stack Overflow") --> "Stack%20Overflow"

    • Uri.EscapeDataString("Stack + Overflow") --> 也编码"+" to "%2b" ---->Stack%20%2B%20%20Overflow

    当用作 URL 的实际部分时,只有最后一个是正确的(与查询字符串参数之一的值相反)

    【讨论】:

    • 我遇到的主要问题是我的解决方案中没有引用 System.Web,但我不知道 EscapeUriString,谢谢!
    • 与 encodeURIComponent() 相比,Uri.EscapeUriString() 不会将“+”编码为“%2b”。请改用 Uri.EscapeDataString()。
    • 使用 WebUtility 而不是 HttpUtility 以避免必须引用 System.Web。 .NET Core 中不存在 HttpUtility。
    • @Steve 你会考虑把你的最后一段加粗吗?这似乎是此页面上最重要的内容,需要更多可见性。
    • 有关 Uri.EscapeUriString 和 Uri.EscapeDataString 之间区别的更多解释,请参见此答案:stackoverflow.com/questions/4396598/…
    【解决方案2】:

    HttpUtility.HtmlEncode/解码
    HttpUtility.UrlEncode/解码

    如果您的项目中没有 System.Web 程序集,您可以添加对它的引用

    【讨论】:

    • 我应该更具体一点:这是针对 Windows 应用程序,System.Web 中唯一可用的项目是:AspNetHostingPermission、AspNetHostingPermissionAttribute 和 AspNetHostingPermissionLevel。
    • 可以添加对 System.Web 程序集的引用
    • HtmlEncoding 是完全不同的东西。 UrlEncode 是一个不应该使用的无意义的 API。对整个 URL 进行编码是没有意义的(除非您实际上想要对其值进行编码以用作参数 - 但这不是这样做的)。编码/转义的要点是您传达的是保留字符应该在没有其通常含义的情况下传递(例如, ? 标识查询,或 & 分隔查询参数)。这需要 UrlEncode 没有也不能拥有的知识。
    【解决方案3】:

    我尝试对 c# 的 javascript 的 encodeURIComponent 进行完全兼容的模拟,经过 4 小时的实验,我发现了这一点

    c#代码:

    string a = "!@#$%^&*()_+ some text here али мамедов баку";
    a = System.Web.HttpUtility.UrlEncode(a);
    a = a.Replace("+", "%20");
    

    结果是: !%40%23%24%25%5e%26*()_%2b%20some%20text%20here%20%d0%b0%d0%bb%d0%b8%20%d0%bc%d0 %b0%d0%bc%d0%b5%d0%b4%d0%be%d0%b2%20%d0%b1%d0%b0%d0%ba%d1%83

    使用 Javascript 的 decodeURLComponent() 解码后;

    你会得到这个: !@#$%^&*()_+ 这里有一些文字 али мамедов баку

    感谢关注

    【讨论】:

    • 有效,但您可以简单地使用Uri.EscapeDataString("!@#$%^&*()_+ some text here али мамедов баку")
    • 实际上,Uri.EscapeDataString 对字符 '(' 和 ')' 进行编码,而 HttpUtility.UrlEncode 没有。
    【解决方案4】:

    System.Uri.EscapeUriString() 似乎没有做任何事情,但 System.Uri.EscapeDataString() 对我有用。

    【讨论】:

      【解决方案5】:

      尝试Server.UrlEncode()System.Web.HttpUtility.UrlEncode() 用于在您无权访问Server 对象的情况下。您还可以使用System.Uri.EscapeUriString() 来避免添加对System.Web 程序集的引用。

      【讨论】:

      • Uri.EscapeUriString() 没有为我做任何事情,但我能够使用 Uri.EscapeDataString() 正确地对字符串进行 url 编码
      • @TolandHon:确实。原因是 Uri.EscapeUriString() 对应于 JavaScript 的 encodeURI() - 它保留了 URI 保留的字符。例如/&、...原样(加上#),而-正如您所发现的,对应于JavaScript的encodeURIComponent()的是Uri.EscapeDataString()
      【解决方案6】:

      对于 Windows 应用商店应用,您将没有 HttpUtility。相反,你有:

      对于 URI,在 '?' 之前:

      • System.Uri.EscapeUriString("example.com/Stack Overflow++?")
        • ->“example.com/Stack%20Overflow++?”

      对于 URI 查询名称或值,在 '?' 之后:

      • System.Uri.EscapeDataString(“堆栈溢出++”)
        • ->“堆栈%20Overflow%2B%2B”

      对于 x-www-form-urlencoded 查询名称或值,在 POST 内容中:

      • System.Net.WebUtility.UrlEncode(“堆栈溢出++”)
        • -> "堆栈+溢出%2B%2B"

      【讨论】:

        【解决方案7】:

        您可以使用 System.Web 命名空间中的 Server 对象

        Server.UrlEncode、Server.UrlDecode、Server.HtmlEncode 和 Server.HtmlDecode。

        编辑:海报补充说,这是一个 Windows 应用程序,而不是人们认为的 Web 应用程序。上面列出的项目可以从 System.Web 中的 HttpUtility 类中获得,必须将其添加为对项目的引用。

        【讨论】:

        • Windows 应用程序无法访问服务器对象
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-30
        • 2010-12-03
        • 2017-01-01
        • 2023-03-30
        • 1970-01-01
        • 2010-12-04
        • 2020-02-07
        相关资源
        最近更新 更多