Есть ли в C # эквивалент JavaScript encodeURIComponent ()? - PullRequest
117 голосов
/ 17 сентября 2008

В JavaScript:

encodeURIComponent("©√") == "%C2%A9%E2%88%9A"

Есть ли эквивалент для приложений на C #? Для экранирования символов HTML я использовал:

txtOut.Text = Regex.Replace(txtIn.Text, @"[\u0080-\uFFFF]",
    m => @"&#" + ((int)m.Value[0]).ToString() + ";");

Но я не уверен, как преобразовать совпадение в правильный шестнадцатеричный формат, который использует JS. Например этот код:

txtOut.Text = Regex.Replace(txtIn.Text, @"[\u0080-\uFFFF]",
    m => @"%" + String.Format("{0:x}", ((int)m.Value[0])));

Возвращает "%a9%221a" для "©√" вместо "%C2%A9%E2%88%9A". Похоже, мне нужно разбить строку на байты или что-то в этом роде.

Редактировать: Это для приложения Windows, в System.Web доступны только следующие элементы: AspNetHostingPermission, AspNetHostingPermissionAttribute и AspNetHostingPermissionLevel.

Ответы [ 7 ]

188 голосов
/ 29 декабря 2010

Uri.EscapeDataString или HttpUtility.UrlEncode - это правильный способ экранирования строки, которая должна быть частью URL.

Возьмем, к примеру, строку "Stack Overflow":

  • HttpUtility.UrlEncode("Stack Overflow") -> "Stack+Overflow"

  • Uri.EscapeUriString("Stack Overflow") -> "Stack%20Overflow"

  • Uri.EscapeDataString("Stack + Overflow") -> Также кодирует "+" to "%2b" ----> Stack%20%2B%20%20Overflow

Только последний является правильным при использовании в качестве фактической части URL (в отличие от значения одного из параметров строки запроса)

18 голосов
/ 17 сентября 2008

HttpUtility.HtmlEncode / Расшифровать
HttpUtility.UrlEncode / Декодировать

Вы можете добавить ссылку на сборку System.Web, если она недоступна в вашем проекте

16 голосов
/ 04 февраля 2011

Я попытался сделать полностью совместимый аналог javascript encodeURIComponent для c #, и после 4-часовых экспериментов я нашел это

c # КОД:

string a = "!@#$%^&*()_+ some text here али мамедов баку";
a = System.Web.HttpUtility.UrlEncode(a);
a = a.Replace("+", "%20");

результат: !% 40% 23% 24% 25% 5e% 26 * () _% 2b% 20some% 20text% 20here% 20% d0% b0% d0% бб% d0% b8% 20% d0% Ьс% d0 % b0% d0% Ьс% d0% b5% d0% b4% d0% быть% d0% b2% 20% d0% b1% d0% b0% d0% BA% D1% 83

После того, как вы декодируете его с помощью decodeURLComponent Javascript ();

вы получите это: ! @ # $% ^ & * () _ + Текст здесь али мамедов баку

Спасибо за внимание

11 голосов
/ 06 марта 2009

System.Uri.EscapeUriString (), похоже, ничего не делал, но System.Uri.Escape Data String () работал для меня.

9 голосов
/ 17 сентября 2008

Попробуйте Server.UrlEncode() или System.Web.HttpUtility.UrlEncode() для случаев, когда у вас нет доступа к объекту Server. Вы также можете использовать System.Uri.EscapeUriString(), чтобы избежать добавления ссылки на сборку System.Web.

6 голосов
/ 10 июня 2013

Для приложения Магазина Windows у вас не будет HttpUtility. Вместо этого у вас есть:

Для URI перед '?':

  • Система. Uri.EscapeUriString ("example.com/Stack Overflow ++?")
    • -> "example.com/Stack%20Overflow++?"

Для имени или значения запроса URI после '?':

  • Система. Uri.EscapeDataString («Переполнение стека ++»)
    • -> «Стек% 20Overflow% 2B% 2B»

Для x-www-form-urlencoded имени или значения запроса в содержимом POST:

  • System.Net. WebUtility.UrlEncode («Переполнение стека ++»)
    • -> «Стек + переполнение% 2B% 2B»
6 голосов
/ 17 сентября 2008

Вы можете использовать объект Server в пространстве имен System.Web

Server.UrlEncode, Server.UrlDecode, Server.HtmlEncode и Server.HtmlDecode.

Редактировать: плакат добавил, что это приложение для Windows, а не веб-приложение, как можно было бы поверить. Перечисленные выше элементы будут доступны из класса HttpUtility внутри System.Web, который необходимо добавить в качестве ссылки на проект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...