Оговорки. Кодирование строки С# в строку Javascript.

Я пытаюсь написать собственный класс помощника 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 и т.д.).

Ответы

Ответ 1

(.NET 4) Вы можете:

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

Ответ 2

Я понимаю, что вам нужно быть осторожным, поскольку JavaScript не UTF-16, скорее, это UCS-2, который, я считаю, является подмножеством UTF-16. Для вас это означает, что любой символ, который представлен, чем более высокая точка кода из 2 байтов (0xFFFF), может вызвать проблемы с JavaScript.

В целом, под обложками, движок может использовать UTF-16, но он предоставляет только методы UCS-2.

Отличная статья по этому вопросу: http://mathiasbynens.be/notes/javascript-encoding

Ответ 4

Вместо использования метода JavaScriptStringEncode() вы можете кодировать серверную сторону, используя:

HttpUtility.UrlEncode()

Когда вам нужно прочитать клиентскую сторону с кодированной строкой, вы должны вызвать функцию unescape() javascript перед использованием строки.