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

时间:2020-03-05 18:59:42  来源:igfitidea点击:

在JavaScript中:

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

Capplications是否具有等效功能?为了转义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中唯一可用的项是:AspNetHostingPermission,AspNetHostingPermissionAttribute和AspNetHostingPermissionLevel。

解决方案

回答

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

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

回答

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

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

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

回答

如果我们无权访问Server对象,请尝试使用Server.UrlEncode()或者System.Web.HttpUtility.UrlEncode()实例。我们也可以使用System.Uri.EscapeUriString()来避免添加对System.Web程序集的引用。

回答

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

回答

Uri.EscapeDataString或者HttpUtility.UrlEncode是转义要成为URL一部分的字符串的正确方法。

以字符串" Stack Overflow"为例:

  • HttpUtility.UrlEncode(" Stack Overflow")->" Stack + Overflow"
  • Uri.EscapeUriString(" Stack Overflow")->" Stack%20Overflow"
  • Uri.EscapeDataString(" Stack + Overflow")->还将" +"编码为"%2b"---->Stack%20%2B%20%20Overflow`

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