C# 是否与 JavaScript 的 encodeURIComponent() 等效?

IT技术 c# javascript .net windows encoding
2021-01-14 00:43:01

在 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有:AspNetHostingPermissionAspNetHostingPermissionAttribute,和AspNetHostingPermissionLevel

6个回答

Uri.EscapeDataString或者HttpUtility.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 的实际部分时,只有最后一个是正确的(与查询字符串参数之一的值相反)

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

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

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

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

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

代码:

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 али мамедов баку")
2021-03-29 00:43:01
实际上,Uri.EscapeDataString编码字符 '(' 和 ')' 而HttpUtility.UrlEncode不是。
2021-03-31 00:43:01

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

Try Server.UrlEncode(),或者System.Web.HttpUtility.UrlEncode()当您无权访问该Server对象时。您还可以使用System.Uri.EscapeUriString()避免添加对System.Web程序集的引用

@TolandHon:确实如此。原因是Uri.EscapeUriString()对应于 JavaScript 的encodeURI()- 它保留了 URI 保留的字符。例如/, &, ... 原样(加号#),而 - 正如您所发现的,它Uri.EscapeDataString()对应于 JavaScript 的encodeURIComponent().
2021-03-18 00:43:01
Uri.EscapeUriString() 没有为我做任何事情,但我能够使用 Uri.EscapeDataString() 正确地对字符串进行 url 编码
2021-03-23 00:43:01