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

时间:2011-05-02 09:47:20

标签: c# javascript asp.net escaping quotes

我只是在使用javascript上的问题我正在使用asp.net上的代码,经过几个小时的计算后发现它变成了转义字符的问题。

起初我使用它。

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

这会导致javascript错误,因为“不能”的引号需要使用转义字符,所以我使用。

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);

没关系。

我很好奇为什么我们需要使用\\'代替\'才能使转义字符正常工作。

5 个答案:

答案 0 :(得分:7)

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

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

当您提供C#"\\'"时,第一个\会转义第二个\(因此第二个\不会被视为转义字符)和{{ 1}}被视为普通'(因为该字符串未与'分隔。

答案 1 :(得分:3)

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

例如:

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

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

@"foo
bar
blip"

答案 2 :(得分:3)

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

我更喜欢在字符串开始之前使用@ special运算符,因为它告诉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);

我不理解JavaScript中滥用单引号的情况,如果我不记得有很多PHP编码器贡献脚本,因为这种语言的行为方式不同,取决于单引号或双引号字符串。 / p>

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

答案 3 :(得分:1)

当您使用 \\ 时,它将转义为逃脱角色的实际javascript中的 \ 。你本质上是逃避两次

答案 4 :(得分:0)

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

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

// 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

注意 =已被单引号包围,因此您可以安全地将其放在.value = ('O@@@Brian'.replace(/@{3}/g, String.fromCharCode(0x27)); 之后。

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

.value

将是插入的赋值表达式,它将作为脚本发送到客户端。执行后,O'Brian包含<!DOCTYPE html> <html lang="en"> <head> <title>Modal Popup Example</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <h2>Modal Popup Example</h2> <!-- Trigger the modal with a button --> <button type="button" class="btn btn-info btn-lg" data-toggle="modal" data-target="#myModal">Open Modal</button> <!-- Modal --> <div class="modal fade" id="myModal" role="dialog"> <div class="modal-dialog"> <!-- Modal content--> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal">&times;</button> <h4 class="modal-title">Modal Header</h4> </div> <div class="modal-body"> <p>Some text in the modal.</p> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> </div> </div> </div> </div> </div> </body> </html>