注意:对于这个任务,您不能(也不应该)使用HTML编码器(如HttpServerUtility.HtmlEncode()
),因为HTML和JavaScript字符串的规则非常不同。例如:字符串"Check your Windows folder c:\windows"
将被编码为"Check your Windows folder c:'windows"
,显然是错误的。此外,它遵循HTML编码规则,因此不会对\、"和'进行任何转义。简而言之,它是用于其他目的。
如果您的目标是ASP.NET Core或.NET 5,那么您应该使用System.Text.Encodings.Web.JavaScriptEncoder
类。
如果您的目标是.NET 4.x,则可以使用HttpUtility.JavaScriptStringEncode()方法。
如果您的目标是.NET 3.x和2.x:
您需要对什么进行编码?一些字符必须进行转义(\、"和'),因为它们对JavaScript解析器具有特殊意义,而其他字符可能会干扰HTML解析,因此也应该进行转义(如果JS在HTML页面中)。您有两个选项可用于转义:JavaScript转义字符</kbd>或\uxxxx
Unicode代码点(请注意,\uxxxx
可以用于所有这些字符,但对于干扰HTML解析器的字符将不起作用)。
您可以手动执行此操作(使用搜索和替换),如下所示:
string JavaScriptEscape(string text)
{
return text
.Replace("\\", @"\u005c")
.Replace("\"", @"\u0022")
.Replace("'", @"\u0027")
.Replace("&", @"\u0026")
.Replace("<", @"\u003c")
.Replace(">", @"\u003e");
}
当然,如果您正在将其用作转义字符,则不应对</kbd>进行转义!这种
盲目替换对于未知的文本(例如来自用户的输入或可能被翻译的文本消息)非常有用。请注意,如果字符串用双引号括起来,则单引号不需要转义,反之亦然。请注意,在C#代码中保留逐字字符串,否则将在C#中执行Unicode替换,并且客户端将接收到未转义的字符串。关于
干扰HTML解析的说明:现在很少需要创建
<script>
节点并将其注入DOM,但这是一种相当常见的技术,网络上充满了像
+ "</s" + "cript>"
这样的代码来解决这个问题。
注意:我说
盲目转义,因为如果您的字符串包含转义序列(例如
\uxxxx
或
\t
),则不应再次转义。为此,您需要围绕此代码做些技巧。
如果您的文本来自用户输入并且可能是多行的,则还应该准备好它,否则您将会得到破碎的JavaScript代码,如下所示:
alert("This is a multiline
comment")
只需将.Replace("\n", "\\n").Replace("\r", "")
添加到之前的JavaScriptEscape()
函数中即可。
为了完整起见:还有另一种方法,如果您对字符串进行编码Uri.EscapeDataString()
,则可以使用decodeURIComponent()
在JavaScript中解码它,但这更像是一个卑鄙的技巧而不是解决方案。