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


135

在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""©√",而不是"%C2%A9%E2%88%9A"它看起来像我需要了分割字符串为字节或东西。

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

Answers:


217

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


我遇到的主要问题是在解决方案中没有引用System.Web,但是我不了解EscapeUriString,谢谢!
travis

53
与encodeURIComponent()相比,Uri.EscapeUriString()不会将“ +”编码为“%2b”。请改用Uri.EscapeDataString()。
jwaliszko 2012年

4
使用WebUtility而不是HttpUtility以避免必须引用System.Web。.NET Core中不存在HttpUtility。
史蒂文·德·科克

2
@Steve您是否考虑将最后一段加粗?在该页面上了解这似乎是最重要的事情,并且需要更多的可见性。
蒂莫,2016年

也看到这个答案更多的解释上Uri.EscapeUriString和Uri.EscapeDataString之间的区别:stackoverflow.com/questions/4396598/...
杰森

20

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

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


我应该更具体一点:这是针对Windows应用程序的,System.Web中可用的唯一项目是:AspNetHostingPermission,AspNetHostingPermissionAttribute和AspNetHostingPermissionLevel。
travis

5
您可以添加对System.Web程序集的引用
David Thibault

2
HtmlEncoding是完全不同的东西。UrlEncode是不切实际的API,切勿使用。对整个URL进行编码是没有意义的(除非您实际上希望对其值进行编码以用作参数-但这不是这样做的)。编码/转义的要点是,您传达的是保留字符应以其通常的含义通过(例如,?标识查询,或&分隔查询参数)。这需要UrlEncode不存在和不具备的知识。
Brandon Paddock

18

我尝试为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的encodeURLComponent()解码后;

您将获得以下信息: !@#$%^&*()_ +一些此处的文字алимамедовбаку

感谢您的关注


2
可以,但是您可以简单地使用它Uri.EscapeDataString("!@#$%^&*()_+ some text here али мамедов баку")
mklement0

实际上,Uri.EscapeDataString对字符'('和')'进行编码,而HttpUtility.UrlEncode对不进行编码。
奥伊斯坦科尔斯鲁德

12

System.Uri.EscapeUriString()似乎什么也没做,但是System.Uri.Escape Data String()对我有用。


10

尝试Server.UrlEncode(),或者System.Web.HttpUtility.UrlEncode()用于您无权访问该Server对象的实例。您也System.Uri.EscapeUriString()可以避免使用对System.Web程序集的引用。


1
Uri.EscapeUriString()对我没有任何作用,但我能够使用Uri.EscapeDataString()对字符串进行适当的URL编码-Toland
Hon

3
@TolandHon:确实。原因是Uri.EscapeUriString()与JavaScript相对应encodeURI()-保留了URI保留的字符。比如/&......原样(加#),而-因为你已经发现,它是Uri.EscapeDataString()对应于JavaScript的encodeURIComponent()
mklement0 '16

8

对于Windows Store应用程序,您将没有HttpUtility。相反,您具有:

对于URI,请在“?”之前:

  • 系统。Uri.EscapeUriString(“ example.com/Stack Overflow ++?”)
    • ->“ example.com/Stack%20Overflow++?”

对于URI查询名称或值,请在“?”之后:

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

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

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

6

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

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

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


1
Windows应用程序无法访问Server对象
travis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.