Ответ 1
(.NET 4) Вы можете:
System.Web.HttpUtility.JavaScriptStringEncode(@"aa\bb ""cc"" dd\tee", true);
==
"aa\\bb \"cc\" dd\\tee"
Я пытаюсь написать собственный класс помощника Javascript MVC3 Helper для моего проекта, и один из методов должен избегать строк С# для строк Javascript.
Я знаю, что строки С# кодировка UTF-16 и строки Javascript также представляется UTF-16. Здесь нет проблем.
Я знаю, что некоторые символы, такие как обратная косая черта, одинарные кавычки или двойные кавычки, должны иметь обратную косую черту в Javascript, поэтому:
\ becomes \\
' becomes \'
" becomes \"
Есть ли какие-либо другие предостережения, о которых я должен знать, прежде чем писать свой метод преобразования?
EDIT: До сих пор я получаю отличные ответы, добавляю некоторые ответы из ответов на вопрос, чтобы помочь другим в будущем.
Алекс К. предложил использовать 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+equivalent+of+JavaScript+escape+
Вместо использования метода JavaScriptStringEncode()
вы можете кодировать серверную сторону, используя:
HttpUtility.UrlEncode()
Когда вам нужно прочитать клиентскую сторону с кодированной строкой, вы должны вызвать функцию unescape()
javascript перед использованием строки.