Неправильная кодировка в response.write

У меня есть строка в веб-приложении Строка выглядит так:

`1234567890-=[]\ ;',./\~!@#$%^&*()_+{}|:"<>?|

после кодирования (с помощью Server.Encode()) показывается следующее:

`1234567890-=[]\\ ;&#39;,./\\~!@#$%^&amp;*()_+{}|:&quot;&lt;&gt;?|

что правильно

Тем не менее, когда я использую Response.Write(theSecondExample) результат примерно такой:

`1234567890-=[]\ ;&#39;,./\~!@#$%^&amp;*()_+{}|:&quot;&lt;&gt;?|

Обратные слеши отсутствуют!

Как может получиться, что результат не соответствует ожиданиям? Как я могу предотвратить это?

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-=[]\ ;&#39;,./\~!@#$%^&amp;*()_+{}|:&quot;&lt;&gt;?|

Точно так же, если вы остановите конец теста и начнете копаться с визуализаторами:

Наведитеa):

"`1234567890-=[]\\ ;',./\\~!@#$%^&*()_+{}|:\"<>?|"

то есть это C# экранированный во всплывающей подсказке и заключенный в кавычки.

НаведитеhtmlEncoded):

"`1234567890-=[]\\ ;&#39;,./\\~!@#$%^&amp;*()_+{}|:&quot;&lt;&gt;?|"

.. опять же, это HTML кодируется и C# экранируется с кавычками

Текст (htmlEncoded):

`1234567890-=[]\ ;&#39;,./\~!@#$%^&amp;*()_+{}|:&quot;&lt;&gt;?|

.. Нет C# убегая

HTML (htmlEncoded):

`1234567890-=[]\ ;',./\~!@#$%^&*()_+{}|:"<>?|

В Times New Roman сценарий конечно:)

Как я полагаю, это возвращает нас к исходной строке - которая также показывает, что описываемый вами сценарий не может иметь место - если вы не прочитали экранированную строку как "правильную", хотя на самом деле это не так. HTML не требует \ чтобы избежать

Другие вопросы по тегам