Как я могу написать побег персонажей Verbatim (без выхода), используя streamwriter?

StackOverflow https://stackoverflow.com/questions/2716253

Вопрос

Я пишу утилиту, которая принимает в файле .resx и создает объект JavaScript, содержащий свойства для всех пар имени / значения в файле .resx. Это все хорошо и хорошо, до одного из ценностей в .resx не

Этот дилер принимает электронные заказы.

/ r / nclick на заказ {0} от этого дилера.

Я добавляю пары имени / значения в объект JS, как это:

streamWriter.Write(string.Format("\n{0} : \"{1}\"", kvp.Key, kvp.Value));

Когда kvp.value = "Этот дилер принимает электронные заказы ./r/nklick на заказ {0} от этого дилера".

Это приводит к тому, что streamwriter.write () фактически разместить новую линию между «заказами». И «Нажмите», который естественным образом закручивает свой выход JavaScript.

Я пробовал разные вещи с @ и без использования string.format, но мне не повезло. Какие-либо предложения?

Редактировать: Это приложение запущено во время сборки, чтобы получить некоторые файлы JavaScript, развернутые позже, поэтому в той же точке не доступен в / запустить ни всех, кроме разработчиков приложений. Поэтому, хотя я, очевидно, нужен способ избежать здесь персонажей, XSS, как таковое не очень беспокоит.

Это было полезно?

Решение

Ваша проблема уже произошла к тому времени, когда вы попадаете в этот код. String.format не будет "расширить" литерал \n а также \r в замещенных струнах ({0} и т. Д.) В новой строке и CR, поэтому он должен произойти в какой-то более ранней точке, возможно, при чтении файла .resx.

У вас есть два возможных решения. Один, как вы обнаружили в комментариях к ответу Доналдрай, это явно обратить вспять эту замену и заменить буквальные новости с двумя персонажами \n:

kvp.Value.Replace("\r",      // <-- replaced by the C# compiler with a literal CR character
                  "\\r");    // <-- "\\" replaced by the C# compiler with a single "\",
                             // leaving the two-char string "\r"

Вам нужно будет сделать то же самое для каждого персонажа, который может появиться в ваших строках. n и R являются наиболее распространенными, а затем T (вкладками); Это, вероятно, достаточно для большинства разработчиков DEV.

string formatted = kvp.Value.Replace("\r", "\\r")
                            .Replace("\n", "\\n")
                            .Replace("\t", "\\t");

В качестве альтернативы, вы можете выглядеть вверх по течению на коде чтения файла .resx и попробуйте найти и удалить деталь, которая явно расширяет эти последовательности символов. Это было бы лучшее общее решение, если это возможно.

Другие советы

Вы должны избежать строк, используя Microsoft's Анти-XSS Библиотека.

Просто избегайте обратных створок.

kvp.Value = kvp.Value.Replace(@"\", @"\\");

Возможно, вам понадобится сделать это, когда вы читаете из файла RESX.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top