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


135

В 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". Похоже , мне нужно разбить строку вверх в байтах или что - то.

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

Ответы:


217

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


Основная проблема, с которой я столкнулся, заключалась в том, что в моем решении не было ссылки на System.Web, но я не знал о EscapeUriString, спасибо!
Travis 03

53
В отличие от encodeURIComponent (), Uri.EscapeUriString () не кодирует «+» в «% 2b». Вместо этого используйте Uri.EscapeDataString ().
jwaliszko

4
Используйте WebUtility вместо HttpUtility, чтобы не ссылаться на System.Web. HttpUtility не существует в .NET Core.
Стивен Де Кок

2
@Steve Не могли бы вы сделать свой последний абзац жирным? Кажется, это самая важная вещь, которую нужно знать на этой странице, и она требует большей наглядности.
Timo

Также см. Этот ответ, чтобы узнать больше о разнице между Uri.EscapeUriString и Uri.EscapeDataString: stackoverflow.com/questions/4396598/…
Джейсон

20

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

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


Я должен был быть более конкретным: это для приложения Windows, единственные элементы, доступные в System.Web: AspNetHostingPermission, AspNetHostingPermissionAttribute и AspNetHostingPermissionLevel.
Travis

5
Вы можете добавить ссылку на сборку System.Web
Дэвид Тибо,

2
HtmlEncoding - совсем другое дело. UrlEncode - это бессмысленный API, который никогда не следует использовать. Нет смысла кодировать весь URL-адрес (если вы действительно не хотите кодировать его значение для использования в качестве параметра - но это не то, что он делает). Точка кодирования / экранирования заключается в том, что вы передаете, что зарезервированный символ должен быть передан без его обычного значения (например, что? Идентифицирует запрос или & разделяет параметры запроса). Это требует знаний, которых у UrlEncode нет и не может быть.
Брэндон Пэддок,

18

Я пытался сделать полностью совместимый аналог 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% 20some% 20text% 20here% 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 decodeURLComponent ();

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

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


2
Работает, но вы можете просто использовать Uri.EscapeDataString("!@#$%^&*()_+ some text here али мамедов баку")вместо этого.
mklement0

Собственно, Uri.EscapeDataStringкодирует символы '(' и ')', а HttpUtility.UrlEncodeне кодирует .
Øystein Kolsrud

12

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


10

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


1
Uri.EscapeUriString () ничего не сделал для меня, но я смог правильно кодировать URL-адреса строк с помощью Uri.EscapeDataString ()
Толанд Хон

3
@TolandHon: Конечно. Причина в том, что это Uri.EscapeUriString()соответствует JavaScript, encodeURI()который сохраняет зарезервированные для URI символы. такие как /, &... как есть (плюс #), в то время как - как вы обнаружили, что Uri.EscapeDataString()что соответствует в JavaScript encodeURIComponent().
mklement0

8

Для приложения Windows Store у вас не будет 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

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

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

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


1
Объект Server недоступен из приложения для Windows,
Трэвис,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.