为啥在字符串中使用 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 转义字符的引号需要是 \\' 而不是 \'的主要内容,如果未能解决你的问题,请参考以下文章