Неправильная кодировка в response.write - PullRequest
2 голосов
/ 27 января 2011

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

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

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

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

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

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

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

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

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

1 Ответ

5 голосов
/ 27 января 2011

Нет ошибки - вы проверяете строку в отладчике, который автоматически экранирует строки - например, "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 не требует \ для экранирования.

...