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

tra*_*vis 126 .net javascript c# windows encoding

在JavaScript中:

encodeURIComponent("©?") == "%C2%A9%E2%88%9A"
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

返回" %a9%221a"for "©?"而不是"%C2%A9%E2%88%9A".看起来我需要将字符串拆分为字节或其他东西.

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

Ste*_*eve 200

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

  • 与encodeURIComponent()相反,Uri.EscapeUriString()不会将"+"编码为"%2b".请改用Uri.EscapeDataString(). (52认同)
  • @Steve Uri.EscapeDataString保存了我们的一天;) (4认同)
  • 使用WebUtility而不是HttpUtility来避免引用System.Web..NET Core中不存在HttpUtility. (3认同)
  • @Steve 你会考虑把你的最后一段加粗吗?这似乎是这个页面上最重要的事情,它需要更多的可见性。 (3认同)

Dav*_*ult 19

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

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

  • 您可以添加对System.Web程序集的引用 (5认同)
  • HtmlEncoding是完全不同的东西。UrlEncode是一个不切实际的API,永远不要使用。对整个URL进行编码没有任何意义(除非您实际上希望对其值进行编码以用作参数-但这不是这样做的)。编码/转义的要点是,您传达的是保留字符应以其通常的含义通过(例如,?标识查询,或&分隔查询参数)。这需要UrlEncode不具备和不具备的知识。 (2认同)

Ali*_*dov 17

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

c#代码:

string a = "!@#$%^&*()_+ some text here ??? ??????? ????";
a = System.Web.HttpUtility.UrlEncode(a);
a = a.Replace("+", "%20");
Run Code Online (Sandbox Code Playgroud)

结果是: !%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%是%D0%B2%20%D0%B1%D0%B0%D0%BA%D1%83

用Javascript的decodeURLComponent()解码它之后;

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

感谢您的关注

  • +1用于尊重问题中的“等同”一词。我正在将一些JavaScript算法转换为VB.NET,这个答案很有用。 (2认同)
  • 可行,但您可以简单地使用 `Uri.EscapeDataString("!@#$%^&*()_+ some text here али мамедов баку")` 代替。 (2认同)

Ech*_*lon 12

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


Bil*_* Jo 9

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

  • @TolandHon:确实。原因是“ Uri.EscapeUriString()”与JavaScript的“ encodeURI()”相对应-保留了URI保留的字符。例如`/`,`&`,... ...(加上#),而-正如您所发现的,它是对应于JavaScript的encodeURIComponent()的Uri.EscapeDataString()。 (2认同)

Cœu*_*œur 7

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

对于URI,在'?'之前:

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

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

  • 系统.Uri.EscapeDataString("Stack Overflow ++")
    • - >"Stack%20Overflow%2B%2B"

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

  • System.Net.WebUtility.UrlEncode("Stack Overflow ++")
    • - >"Stack + Overflow%2B%2B"


Mit*_*ers 6

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

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

编辑:海报补充说,这是一个Windows应用程序而不是人们会相信的网络应用程序.上面列出的项目可以从System.Web中的HttpUtility类获得,该类必须作为项目的引用添加.