注意事项将C#字符串编码为Javascript字符串

Caveats Encoding a C# string to a Javascript string

本文关键字:字符串 Javascript 编码 注意事项      更新时间:2023-09-26

我正试图为我的项目编写一个自定义的Javascript MVC3 Helper类,其中一个方法应该是将C#字符串转义为Javascript字符串。

我知道C#字符串是UTF-16编码的,Javascript字符串似乎也是UTF-16。这里没问题。

我知道一些字符,如反斜杠,单引号或双引号必须在Javascript上进行反斜杠转义,所以:

' becomes ''
' becomes ''
" becomes '"

在编写转换方法之前,是否还有其他需要注意的事项?

编辑:到目前为止,答案很好,我在问题的答案中添加了一些参考资料,以帮助未来的其他人。

Alex K.建议使用System.Web.HttpUtility.JavaScriptStringEncode,我将其标记为适合我的答案,因为我使用的是.Net 4。但是这个功能在以前的.Net版本中不可用,所以我在这里添加了一些其他资源:

CR  becomes 'r   // Javascript string cannot be broke into more than 1 line
LF  becomes 'n   // Javascript string cannot be broke into more than 1 line
TAB becomes 't
Control characters must be Hex-Escaped

JP Richardson提供了一个有趣的链接,告知Javascript使用UCS-2,这是UTF-16的一个子集,但如何正确编码这是一个全新的问题。

LukeH在下面的评论中提醒了CR、LF和TAB字符,这让我想起了控制字符(BEEP、NULL、ACK等)。

(.net 4)您可以;

System.Web.HttpUtility.JavaScriptStringEncode(@"aa'bb ""cc"" dd'tee", true);
== 
"aa''bb '"cc'" dd''tee"

我的理解是,您必须小心,因为JavaScript不是UTF-16,而是UCS-2,我认为它是UTF-16的子集。这对您来说意味着,任何超过2字节(0xFFFF)的代码点的字符都可能在JavaScript中给您带来问题。

总之,在幕后,发动机可能使用UTF-16,但它只公开了类似UCS-2的方法。

关于这个问题的精彩文章:http://mathiasbynens.be/notes/javascript-encoding

只需使用Microsoft.JScript.GlobalObject.escape

在这里找到它:http://forums.asp.net/p/1308104/4468088.aspx/1?Re+C++等价物+of+JavaScript+escape+

您可以使用对服务器端进行编码,而不是使用JavaScriptStringEncode()方法

HttpUtility.UrlEncode()

当您需要在客户端读取编码字符串时,在使用字符串之前必须调用unescape() javascript函数。