Имеет ли С# эквивалент JavaScript encodeURIComponent()?

В JavaScript:

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

Есть ли эквивалент для приложений С#? Для экранирования символов 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.

Ответ 1

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-адреса (в отличие от значения одного из параметров строки запроса)

Ответ 2

HttpUtility.HtmlEncode/Декодирование
HttpUtility.UrlEncode/Декодирование

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

Ответ 3

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

С# CODE:

string a = "[email protected]#$%^&*()_+ 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

После декодирования с помощью Javascript decodeURLComponent();

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

Для URI перед символом '?':

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

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

  • Система. Uri.EscapeDataString ( "Qaru ++" )
    • → "Stack %20Overflow% 2B% 2B"

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

  • System.Net. WebUtility.UrlEncode ( "Qaru ++" )
    • → "Stack + Overflow% 2B% 2B"