Есть ли в 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.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
147
0
107 870
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

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

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

travis 17.09.2008 23:15

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

David Thibault 17.09.2008 23:18

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

Brandon Paddock 15.04.2016 22:53

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

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

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

Объект Server недоступен из приложения Windows

travis 17.09.2008 23:21

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

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

Toland Hon 13.02.2014 05:15

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

mklement0 18.09.2016 23:42

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

Ответ принят как подходящий

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.01.2011 19:29

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

jwaliszko 30.04.2012 14:17

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

Steven De Kock 31.12.2015 04:15

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

Timo 25.08.2016 18:45

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

Jason 16.03.2017 19:12

См. Этот ответ для получения дополнительных сведений о разнице между HttpUtility.UrlEncode и HttpUtility.UrlPathEncode stackoverflow.com/questions/4145823/…

Jason 16.03.2017 19:30

UrlPathEncode и EscapeUriString не кодируют амперсанд &, но Uri.EscapeDataString и HttpUtility.UrlEncode() кодируют

nothingisnecessary 28.03.2017 21:52

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

КОД 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% bb% d0% b8% 20% d0% bc% d0% b0% d0% bc% d0% b5% d0% b4% d0% be% d0% b2% 20% d0% b1% d0% b0% d0% ba% d1% 83

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

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

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

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

mklement0 18.09.2016 19:06

Фактически, Uri.EscapeDataString кодирует символы '(' и ')', а HttpUtility.UrlEncode - нет.

Øystein Kolsrud 05.09.2019 11:45

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

Для URI перед знаком?:

  • System.Uri.EscapeUriString ("example.com/Stack Overflow ++?")
    • -> "example.com/Stack%20Overflow++?"

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

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

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

  • System.Net.WebUtility.UrlEncode («Переполнение стека ++»)
    • -> «Стек + переполнение% 2B% 2B»

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