Подтвердить что ты не робот

Портативная библиотека классов HttpUtility.UrlEncode

Я понимаю, что создание веб-запросов довольно хорошо поддерживается в Portable Class Library. Есть ли эквивалент HttpUtility.UrlEncode в PCL? Мне это нужно для приложений Windows Phone и Metro.

4b9b3361

Ответ 1

WebUtility

В портативных библиотеках классов, которым посчастливилось ориентироваться на .NET 4.5 (например, Profile7), многие из методов HttpUtility имеют братья и сестры в System.Net.WebUtility.

using System.Net;

WebUtility.UrlEncode("some?string#");

Потенциальное предупреждение

В то время как некоторые из методов брата, похоже, идентичны своим коллегам HttpUtility, у этого есть небольшая разница между результирующими кодировками. WebUtility.UrlEncode генерирует кодировки верхнего регистра, а HttpUtility.UrlEncode генерирует строчные кодировки.

WebUtility.UrlEncode("?") // -> "%3F"
HttpUtility.UrlEncode("?") // -> "%3f"

Сделать его обратно совместимым

Если вы зависите от своего кода PCL, генерирующего именно то, что вы бы сгенерировали с помощью предыдущего кода HttpUtility, вы могли бы создать свой собственный вспомогательный метод вокруг этого метода и повторно использовать его.

using System.Text.RegularExpressions;

public static string UrlEncodeOldSchool(string value) {
    var encodedValue = WebUtility.UrlEncode(value);
    return Regex.Replace(encodedValue, "(%[0-9A-F]{2})",
                         encodedChar => encodedChar.Value.ToLowerInvariant());
}

(Даже если это простой, всегда регулярное выражение на свой страх и риск.)

Ответ 2

Используйте Uri.EscapeUriString и Uri.EscapeDataString

Единственное различие между ними состоит в том, что EscapeDataString также кодирует зарезервированные символы RFC 2396, которые включают в себя эти символы ;/?:@&=+$,

Важно отметить, что ни один из этих методов не кодирует незарезервированные символы RFC 2396, которые включают -_.!~*'() Поэтому, если вам нужны эти кодировки, вам придется их вручную закодировать.