使用 C# 对 JavaScript 的 escape() 进行转义

Posted

技术标签:

【中文标题】使用 C# 对 JavaScript 的 escape() 进行转义【英文标题】:Unescape JavaScript's escape() using C# 【发布时间】:2011-04-16 05:50:49 【问题描述】:

C# 中的 any 函数是否像 javascript 一样处理转义/取消转义?

我有一个这样的 JSON 字符串:

"Feeds":["Url":"www.test.com","FeedType":"Twitter","Url":"www.test2.com","FeedType":"Youtube"]

escape()之后的样子

%7B%22Feeds%22%3A%5B%7B%22Url%22%3A%22www.test.com%22%2C%22FeedType%22%3A%22Twitter%22%7D%2C%7B%22Url%22%3A%22www.test2.com%22%2C%22FeedType%22%3A%22Youtube%22%7D%5D%7D

在我的 C# 代码中,我想取消转义该字符串,使其看起来与 escape() 之前完全相同

这可能吗?

【问题讨论】:

【参考方案1】:

这是我发现使用这些的最佳方式:

用 C# 编码:

System.Uri.EscapeDataString("<string>");

用 JavaScript 解码:

decodeURI("<string>");

用 JavaScript 编码:

encodeURI("<string>");

用 C# 解码:

System.Uri.UnescapeDataString("<string>");

2016 年 1 月 27 日更新:刚刚发现似乎更兼容的方式,它还使用 javascript 对 URI 协议 (http://) 进行编码:

用 JavaScript 编码:

encodeURIComponent("<string>");

用 JavaScript 解码:

decodeURIComponent("<string>");

【讨论】:

【参考方案2】:

要取消转义而不必引用 System.Web 以使用 HttpUtility,请尝试以下操作:

Str = Str.Replace("+", " ");
Str = Regex.Replace(Str, "%([A-Fa-f\\d]2)", a => "" + Convert.ToChar(Convert.ToInt32(a.Groups[1].Value, 16)));

另外,当我尝试 HttpUtility.UrlDecode 时,它​​不适用于特殊字符 áéíóúñ。

【讨论】:

【参考方案3】:
    internal static string UnJavascriptEscape(string s)
    
        // undo the effects of JavaScript's escape function
        return HttpUtility.UrlDecode(s.Replace("+", "%2b"), Encoding.Default);
    

【讨论】:

【参考方案4】:

我花了 8 个小时试图得到 ​​p>

HttpUtility.UrlDecode 

工作,放弃使用

HttpUtility.htmlDecode

立即生效。

【讨论】:

【参考方案5】:

天啊,为什么我们有时会想太多。 当一个 API 函数很傻时,向库开发人员发送 karma cuss,然后解决它...

HttpUtility.UrlEncode(editext, System.Text.Encoding.Default).Replace("+","%20");

【讨论】:

【参考方案6】:

escape() 等价于

HttpUtility.UrlDecode(str, System.Text.Encoding.Default);

默认情况下,UrlDecode 使用 UTF8,而 escape() 不使用。

【讨论】:

UTF8 向后兼容 ASCII,因此,除非我误解了某些内容,否则您不必传入编码。 这是错误的……escape()实际上相当于HttpUtility.UrlDecode(str, Encoding.Default),这意味着两件事:①它取决于你的系统区域设置; ② 它是 1990 年代过时的 8 位技术,与 UTF-8 不兼容。 (不过第二段是正确的。) @Justin Niessner:正如你所说,它落后了compatible。不等价。而且我想强调backward,甚至不认为它与其他方式兼容。 HttpUtility.UrlDecode(msg, System.Text.Encoding.Default);实际上对我有用 对于带有特殊字符的语言,这可以解决问题,谢谢先生【参考方案7】:

HttpUtility.UrlDecode 应该可以解决问题。

【讨论】:

@Timwi - 你是对的。我读错了。更新。只是出于好奇,您为什么使用自己的代码(现已删除)来做同样的事情,而不是重新使用 .NET 提供的代码? 谢谢,我尝试了HttpUtility.HtmlDecode,但它没有用,但是当我看到你的回答时,我发现UrlDecode 做了HtmlDecode 没有做的事情。 这不处理“+”字符。 (尝试在“abc+def”上使用 UrlDecode,它似乎将 + 替换为空格。)我暂时使用 Microsoft.JScript.GlobalObject.unencode() 但我讨厌为此引入依赖项......跨度> "+" 是 URL 中的空格字符。这也取决于编码器。在 JavaScript 中,您想使用 encodeURIComponent 而不是 escape,它也包含 + 字符。 这没有正确解码瑞典语字符 - å 被转义为 %E5 并解码为:�

以上是关于使用 C# 对 JavaScript 的 escape() 进行转义的主要内容,如果未能解决你的问题,请参考以下文章

JS对字符串进行编码

使用 C# 对 JavaScript 的 escape() 进行转义

escape()encodeURI()encodeURIComponent()区别详解

escape()encodeURI()encodeURIComponent()区别详解

escape()encodeURI()encodeURIComponent()区别详解

escape()encodeURI()encodeURIComponent()区别详解