Есть ли в 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, который необходимо добавить в качестве ссылки на проект.