почему при использовании Javascript экранирующий символ кавычки в строке должен быть \\ 'вместо \' - PullRequest
5 голосов
/ 02 мая 2011

У меня просто проблемы с javascript, который я использую для кода на asp.net, после нескольких часов его выяснения выясняется, что это проблема escape-символа.

Сначала я использую это.

ScriptManager.RegisterStartupScript(this, this.GetType(), "temp", "alert('Can't delete this data because it is bound with rate plan');", true);

Это сделало ошибку javascript, потому что в кавычке «не могу» нужно использовать escape-символ, поэтому я использую.

ScriptManager.RegisterStartupScript(this, this.GetType(), "temp", "alert('Can\'t delete this data because it is bound with rate plan');", true);

но все равно не работает.

наконец я использую

ScriptManager.RegisterStartupScript(this, this.GetType(), "temp", "alert('Can\\'t delete this data because it is bound with rate plan');", true);

и это нормально.

Мне просто любопытно, почему мы должны использовать \\' вместо \' для правильной работы escape-символа.

Ответы [ 5 ]

7 голосов
/ 02 мая 2011

\ является escape-символом в C # и в JavaScript.

При указании C # "\'" создает строку, содержащую апостроф.

Когда вы даете C # "\\'", то первый \ экранирует второй \ (поэтому второй \ не рассматривается как escape-символ), а ' рассматривается какобычный ' (поскольку строка не разделена '.

3 голосов
/ 02 мая 2011

Потому что "\" также является экранирующим символом для C #.

Я бы предпочел использовать специальный оператор @ в начале вашей строки, непосредственно перед ее запуском, потому что он говорит C #, что он не должен обрабатывать экранирующие символы.

Например:

ScriptManager.RegisterStartupScript(this, this.GetType(), "temp", @"alert('Can\'t delete this data because it is bound with rate plan');", true);

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

ScriptManager.RegisterStartupScript(this, this.GetType(), "temp", "alert(\"Can't delete this data because it is bound with rate plan\");", true);

Я не понимаю злоупотребления одинарными кавычками в JavaScript, если я не помню, чтобы было много PHP-кодеров, предоставляющих сценарии, поскольку этот язык ведет себя по-разному в зависимости от строк в одинарных или двойных кавычках.

В любом случае, вы можете проверить этот другой вопрос об одинарных и двойных кавычках в JavaScript:

3 голосов
/ 02 мая 2011

В строке ac # необходимо экранировать \, так как это специальный префикс для таких вещей, как \n и т. Д. Вам может быть проще использовать буквенный буквальный стриг , который нене нужно экранировать (кроме " до "").

Например:

@"... can\'t ..."

Обратите внимание на ведущий @ перед строковым литералом, что указывает на использование альтернативных правил экранирования.Это также позволяет переводить строки и т. Д. Непосредственно в строку, например

@"foo
bar
blip"
1 голос
/ 02 мая 2011

Когда вы используете \\ , он сбрасывается до \ в реальном javascript, который экранирует символ.Вы, по сути, дважды убегаете

0 голосов
/ 25 августа 2016

Одиночные кавычки и апострофы в именах (такие как O'Brian) обычно вызывают проблемы в динамических клиентских сценариях, потому что они ломают их и позволяют вставлять вредоносный код (так называемые атаки сценариев).

Я написал следующий C # 6 метод расширения для кода для решения этой проблемы:

public static class Extension
{
    public static string ToSQEscapedStringJS<T>(this T unescapedStr)
    {
        if (unescapedStr == null || unescapedStr.ToString() == "")
        {
            return "''";
        }
        // replace ' by @@@
        var escapedStr = (unescapedStr).ToString().Replace("'", "@@@"); 
        // JS code to replace @@@ by '
        string unEscapeSQuote = "replace(/@{3}/g, String.fromCharCode(0x27))"; 
        // add @@@ escaped string with conversion back to '
        return $"('{escapedStr}'.{unEscapeSQuote})"; 
    }
}

Его использование просто. Рассмотрим следующий пример динамического скрипта:

// contains apostroph (aka single quote) and is dangerous for your script block
var name = "O'Brian"; 
var nameEscp = name.ToSQEscapedStringJS(); // creates JS expression from it
// building up the script
string strScript = 
   $"<script>window.opener.document.forms(0).{control.Value}.value = {nameEscp};</script>";
ClientScript.RegisterClientScriptBlock(this.GetType(), "anything", strScript);

Обратите внимание , что nameEscp уже заключено в одинарные кавычки, поэтому вы можете безопасно поместить его после =.

Хитрость в том, что строка экранируется и сразу после назначения сразу же выходит (путем выполнения выражения JavaScript) на лету, т.е.

.value = ('O@@@Brian'.replace(/@{3}/g, String.fromCharCode(0x27));

будет вставленным выражением присваивания, которое будет отправлено клиенту в виде скрипта. После исполнения .value содержит O'Brian.

...