Неправильная кодировка в response.write
У меня есть строка в веб-приложении Строка выглядит так:
`1234567890-=[]\ ;',./\~!@#$%^&*()_+{}|:"<>?|
после кодирования (с помощью Server.Encode()) показывается следующее:
`1234567890-=[]\\ ;',./\\~!@#$%^&*()_+{}|:"<>?|
что правильно
Тем не менее, когда я использую Response.Write(theSecondExample)
результат примерно такой:
`1234567890-=[]\ ;',./\~!@#$%^&*()_+{}|:"<>?|
Обратные слеши отсутствуют!
Как может получиться, что результат не соответствует ожиданиям? Как я могу предотвратить это?
1 ответ
Нет ошибки - вы проверяете строку в отладчике, который автоматически экранирует строки - например, "Hello \ Goodbye"
будет отображаться в отладчике как "Hello \\ Goodbye"
,
Тем не менее, отладчик ведет себя по-разному в зависимости от того, как вы просматриваете строку (а также от того, является ли она C#/VB, конечно):
- Наведите указатель мыши на строку (наиболее часто встречающуюся), и во всплывающей подсказке появится экранированная версия.
- Окно просмотра / Местные жители и т. Д. Также отображают экранированную версию
- Если вы выберете визуализатор "Текст", вы увидите неэкранированную версию - это то, что вы должны сделать, чтобы действительно проверить вашу строку.
- HTML визуализатор делает именно то, что говорит на банке:)
Обновить
Итак, я пошел немного дальше и запустил VS2010, пожалуйста, создайте тестовый проект и выполните его до конца.
[TestMethod]
public void TestMethod1()
{
string a = @"`1234567890-=[]\ ;',./\~!@#$%^&*()_+{}|:""<>?|";
Console.WriteLine("Original:");
Console.WriteLine("{0}", a);
string htmlEncoded = System.Web.HttpUtility.HtmlEncode(a);
Console.WriteLine("Html Encoded:");
Console.WriteLine("{0}", htmlEncoded);
}
(очевидно, я использовал дословную строку изначально, чтобы избежать экранирования чего-либо, кроме двойной кавычки).
Консольный вывод теста:
Original:
`1234567890-=[]\ ;',./\~!@#$%^&*()_+{}|:"<>?|
Html Encoded:
`1234567890-=[]\ ;',./\~!@#$%^&*()_+{}|:"<>?|
Точно так же, если вы остановите конец теста и начнете копаться с визуализаторами:
Наведитеa
):
"`1234567890-=[]\\ ;',./\\~!@#$%^&*()_+{}|:\"<>?|"
то есть это C# экранированный во всплывающей подсказке и заключенный в кавычки.
НаведитеhtmlEncoded
):
"`1234567890-=[]\\ ;',./\\~!@#$%^&*()_+{}|:"<>?|"
.. опять же, это HTML кодируется и C# экранируется с кавычками
Текст (htmlEncoded
):
`1234567890-=[]\ ;',./\~!@#$%^&*()_+{}|:"<>?|
.. Нет C# убегая
HTML (htmlEncoded
):
`1234567890-=[]\ ;',./\~!@#$%^&*()_+{}|:"<>?|
В Times New Roman сценарий конечно:)
Как я полагаю, это возвращает нас к исходной строке - которая также показывает, что описываемый вами сценарий не может иметь место - если вы не прочитали экранированную строку как "правильную", хотя на самом деле это не так. HTML не требует \
чтобы избежать