В 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.





HttpUtility.HtmlEncode / декодирование HttpUtility.UrlEncode / декодирование
Вы можете добавить ссылку на сборку System.Web, если она недоступна в вашем проекте.
Вы можете добавить ссылку на сборку System.Web
HtmlEncoding - совсем другое дело. UrlEncode - это бессмысленный API, который никогда не следует использовать. Нет смысла кодировать весь URL-адрес (если вы действительно не хотите кодировать его значение для использования в качестве параметра - но это не то, что это делает). Точка кодирования / экранирования заключается в том, что вы передаете, что зарезервированный символ должен быть передан без его обычного значения (например, что? Идентифицирует запрос или & разделяет параметры запроса). Для этого требуются знания, которых у UrlEncode нет и не может быть.
Вы можете использовать объект Server в пространстве имен System.Web
Server.UrlEncode, Server.UrlDecode, Server.HtmlEncode и Server.HtmlDecode.
Обновлено: плакат добавил, что это приложение для Windows, а не веб-приложение, как можно было бы подумать. Перечисленные выше элементы будут доступны из класса HttpUtility внутри System.Web, который необходимо добавить в качестве ссылки на проект.
Объект Server недоступен из приложения Windows
Попробуйте Server.UrlEncode() или System.Web.HttpUtility.UrlEncode() для случаев, когда у вас нет доступа к объекту Server. Вы также можете использовать System.Uri.EscapeUriString(), чтобы избежать добавления ссылки на сборку System.Web.
Uri.EscapeUriString () ничего не сделал для меня, но я смог правильно закодировать строки с помощью Uri.EscapeDataString ()
@TolandHon: Конечно. Причина в том, что Uri.EscapeUriString() соответствует encodeURI() JavaScript, который сохраняет символы, зарезервированные для URI. такие как /, &, ... как есть (плюс #), тогда как - как вы обнаружили, именно Uri.EscapeDataString() соответствует encodeURIComponent() в JavaScript.
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, спасибо!
В отличие от encodeURIComponent (), Uri.EscapeUriString () не кодирует «+» в «% 2b». Вместо этого используйте Uri.EscapeDataString ().
Используйте WebUtility вместо HttpUtility, чтобы не ссылаться на System.Web. HttpUtility не существует в .NET Core.
@Steve Не могли бы вы сделать свой последний абзац жирным? Кажется, это самая важная вещь, которую нужно знать на этой странице, и она требует большей наглядности.
Также см. Этот ответ для получения дополнительных сведений о разнице между Uri.EscapeUriString и Uri.EscapeDataString: stackoverflow.com/questions/4396598/…
См. Этот ответ для получения дополнительных сведений о разнице между HttpUtility.UrlEncode и HttpUtility.UrlPathEncode stackoverflow.com/questions/4145823/…
UrlPathEncode и EscapeUriString не кодируют амперсанд &, но Uri.EscapeDataString и HttpUtility.UrlEncode() кодируют
Я попытался сделать полностью совместимый аналог 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 али мамедов баку").
Фактически, Uri.EscapeDataString кодирует символы '(' и ')', а HttpUtility.UrlEncode - нет.
Для приложения Windows Store у вас не будет HttpUtility. Вместо этого у вас есть:
Для URI перед знаком?:
Для имени или значения запроса URI после символа '?':
Для имени или значения запроса x-www-form-urlencoded в содержимом POST:
Я должен был быть более конкретным: это для приложения Windows, единственные элементы, доступные в System.Web: AspNetHostingPermission, AspNetHostingPermissionAttribute и AspNetHostingPermissionLevel.