为啥在字符串中使用 javascript 转义字符的引号需要是 \\' 而不是 \'

Posted

技术标签:

【中文标题】为啥在字符串中使用 javascript 转义字符的引号需要是 \\\\\' 而不是 \\\'【英文标题】:why using javascript escape character of quotation in string need to be \\' instead of \'为什么在字符串中使用 javascript 转义字符的引号需要是 \\' 而不是 \' 【发布时间】:2011-08-16 20:58:45 【问题描述】:

我只是在 asp.net 上的代码上使用的 javascript 出现问题,经过几个小时的弄清楚,原来是转义字符的问题。

一开始我用这个。

ScriptManager.RegisterStartupScript(this, this.GetType(), "temp", "alert('Can't delete this data because it is bound with rate plan');", true);

这将导致 javascript 错误,因为 "can't" 处的引用需要使用转义字符,所以我使用。

ScriptManager.RegisterStartupScript(this, this.GetType(), "temp", "alert('Can\'t delete this data because it is bound with rate plan');", true);

但还是不行。

我终于用了

ScriptManager.RegisterStartupScript(this, this.GetType(), "temp", "alert('Can\\'t delete this data because it is bound with rate plan');", true);

没关系。

我只是好奇为什么我们需要使用\\' 而不是\' 以使转义字符正常工作。

【问题讨论】:

【参考方案1】:

\ 是 C# 中的转义字符和 JavaScript 中的

当你给 C# "\'" 是创建一个包含撇号的字符串。

当您提供 C# "\\'" 时,第一个 \ 转义第二个 \(因此第二个 \ 不被视为转义字符)并且 ' 被视为普通 @987654328 @(因为字符串不是用'分隔的。

【讨论】:

感谢您的详尽解释,这样的问题我会更加小心。【参考方案2】:

在 ac# 字符串中,\ 需要转义,因为它是 \n 等事物的特殊前缀。您可能会发现使用 逐字字符串文字 更容易,它不需要转义(""" 除外)。

例如:

@"... can\'t ..."

注意前面的@ 字符串文字之前,它表示替代转义规则的使用。这也允许直接在字符串中使用换行符等,即

@"foo
bar
blip"

【讨论】:

【参考方案3】:

因为“\”也是 C# 的转义字符。

我更喜欢在字符串的开头使用 @ 特殊运算符,就在它开始之前,因为它告诉 C# 它不能处理转义字符。

例如:

ScriptManager.RegisterStartupScript(this, this.GetType(), "temp", @"alert('Can\'t delete this data because it is bound with rate plan');", true);

无论如何,我找不到单引号的意义。您可以通过使用双引号字符串表示法来避免转义这个单引号:

ScriptManager.RegisterStartupScript(this, this.GetType(), "temp", "alert(\"Can't delete this data because it is bound with rate plan\");", true);

如果我不记得有很多 php 编码人员贡献脚本,我不理解 JavaScript 中单引号的滥用,因为这种语言的行为方式因单引号或双引号字符串而异。

无论如何,您可以查看有关 JavaScript 中单引号和双引号的其他问题:

When to use double or single quotes in JavaScript?

【讨论】:

谢谢,我对单引号和双引号不太了解,谢谢你指出这个问题,以便我下次可以更正确地使用它:) 当然,我发现在 JavaScript 或任何其他语言中使用其他语言的“优点”是一种不好的方法,如果这些语言没用的话:) 很高兴知道它很有用。【参考方案4】:

当您使用 \\ 时,它会在转义字符的实际 javascript 中转义为 \。你实际上是在逃跑两次

【讨论】:

感谢您的回答垫:D【参考方案5】:

名称中的单引号和撇号(例如 O'Brian)通常会在动态客户端脚本中造成问题,因为它们会破坏它们并允许插入恶意代码(也称为脚本攻击)。

我已经为代码隐藏编写了以下 C#6 扩展方法来解决这个问题:

public static class Extension

    public static string ToSQEscapedStringJS<T>(this T unescapedStr)
    
        if (unescapedStr == null || unescapedStr.ToString() == "")
        
            return "''";
        
        // replace ' by @@@
        var escapedStr = (unescapedStr).ToString().Replace("'", "@@@"); 
        // JS code to replace @@@ by '
        string unEscapeSQuote = "replace(/@3/g, String.fromCharCode(0x27))"; 
        // add @@@ escaped string with conversion back to '
        return $"('escapedStr'.unEscapeSQuote)"; 
    

它的用法很简单。考虑以下动态脚本示例:

// contains apostroph (aka single quote) and is dangerous for your script block
var name = "O'Brian"; 
var nameEscp = name.ToSQEscapedStringJS(); // creates JS expression from it
// building up the script
string strScript = 
   $"<script>window.opener.document.forms(0).control.Value.value = nameEscp;</script>";
ClientScript.RegisterClientScriptBlock(this.GetType(), "anything", strScript);

注意 nameEscp 已经被单引号包围,因此您可以安全地将其放在= 之后。

诀窍是字符串被转义,并且在分配时立即取消转义(通过执行 JavaScript 表达式),即

.value = ('O@@@Brian'.replace(/@3/g, String.fromCharCode(0x27));

将是插入的赋值表达式,它将作为脚本发送给客户端。执行后,.value 包含O'Brian

【讨论】:

以上是关于为啥在字符串中使用 javascript 转义字符的引号需要是 \\' 而不是 \'的主要内容,如果未能解决你的问题,请参考以下文章

为啥html,xml的特殊符号转义不用斜杠,而要用& quot ;这样的奇怪形式?

JavaScript 转义字符

javascript 星号转义符

为啥斜线在 JSON 中是可转义字符? [复制]

Javascript函数调用。字符串中的转义引号[重复]

HTML-实体(转义字符)