Предупреждения, кодирующие строку C # в строку Javascript - PullRequest
17 голосов
/ 23 февраля 2012

Я пытаюсь написать собственный класс Javascript MVC3 Helper для моего проекта, и предполагается, что один из методов должен экранировать строки C # в строки Javascript.

Я знаю, что строки C # UTF-16 кодированных , а строки Javascript также выглядят как UTF-16 .Здесь нет проблем.

Я знаю, что некоторые символы, такие как обратная косая черта, одинарные или двойные кавычки, должны быть экранированы обратной косой чертой в Javascript, поэтому:

\ becomes \\
' becomes \'
" becomes \"

Есть ли какие-либо другие предупреждения, о которых я должен знатьперед написанием моего метода преобразования?

РЕДАКТИРОВАТЬ: Пока хорошие ответы, я добавляю некоторые ссылки из ответов в вопросе, чтобы помочь другим в будущем.

Алекс К.предложил использовать 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 и т. Д.).

Ответы [ 4 ]

33 голосов
/ 23 февраля 2012

(. Net 4) Вы можете;

System.Web.HttpUtility.JavaScriptStringEncode(@"aa\bb ""cc"" dd\tee", true);
== 
"aa\\bb \"cc\" dd\\tee"
1 голос
/ 23 февраля 2012

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

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

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

0 голосов
/ 15 июля 2013

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

HttpUtility.UrlEncode()

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

0 голосов
/ 23 февраля 2012

Просто используйте Microsoft.JScript.GlobalObject.escape

Нашел здесь: http://forums.asp.net/p/1308104/4468088.aspx/1?Re+C+equivalent+of+JavaScript+escape+

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...