Есть ли в C# эквивалент JavaScript encodeURIComponent()?

В 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 ответов

Решение

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

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

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

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

код # #:

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

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

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

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

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

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

Для приложения Магазина 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"

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

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

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

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

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