Декодирование экранированного Url без использования HttpUtility.UrlDecode

Есть ли какая-либо функция, которая преобразует escape-строку Url в ее необработанную форму? System.Web.HttpUtility.UrlDecode() может выполнять эту работу, но я не хочу добавлять ссылку на System.Web.dll. Поскольку мое приложение не является веб-приложением, я не хочу добавлять зависимость только для использования функции в сборке.

ОБНОВЛЕНИЕ: Отметьте сообщение в блоге Rick Strahl об этой же проблеме.

Ответ 1

EDIT: Используйте статический метод Uri.UnescapeDataString() для декодирования ваших URL-адресов:

Закодировано: http%3a%2f%2fwww.google.com%2fsearch%3fhl%3den%26q%3dsomething%20%2323%26btnG%3dGoogle%2bSearch%26aq%3df%26oq%3d

Декодировано: http://www.google.com/search?hl=en&q=something #23&btnG=Google+Search&aq=f&oq=

Ответ 2

Если вы используете .NET 4.0 или новее, вы можете использовать WebUtility.UrlDecode, который работает с профилем клиента, а также правильно обрабатывает плюс знаки ( см. это обсуждение).

Ответ 3

Не загружайте System.Web.dll, как отмечали другие, вам не стоит волноваться, если вы не знаете, что вам нужно иметь дело с клиентами, которые могут не иметь его ( "профиль клиента", "компактная структура", "micro framework", "silverlight" ).

Re-пространство; это будет не очень много; обратите внимание, что сборки .NET JITted основаны на методах, поэтому не будет никаких существенных накладных расходов, просто используя несколько методов.

Реальная проблема (IMO) - это ваш уровень уверенности в том, что у клиента есть System.Web.dll; если вы счастливы, что используете полную фреймворк, а затем просто идите.

Ответ 4

@Smith
У меня была проблема с сохранением. Никаких изменений или просто дальнейшего разговора.

После тестирования многих вещей я заметил, что тестовая строка декодировала. В конечном итоге мне пришлось создать новую пустую строку, установить ее значение в кодированную строку, а затем запустить WebUtility.HtmlDecode и Uri.UnescapeDataString в новой строке. По какой-то причине мне пришлось запустить декодирование и unescape в том порядке, о котором я упоминал. Bizarre.

Я решил это с чем-то вроде этого.

Dim strEncoded as string="http%3a%2f%2fwww.google.com%2fsearch%3fhl%3den%26q%3dsomething%20%2323%26btnG%3dGoogle%2bSearch%26aq%3df%26oq%3d"

Dim strDecoded as string = ""
strDecoded = strEncoded
strDecoded = WebUtility.HtmlDecode(strDecoded)
strDecoded = Uri.UnescapeDataString(strDecoded)

Ответ 5

Команда Microsoft ACE имеет расширенную (и лучшую) версию декодирования в библиотеке Anti-XSS. Однако я не уверен, что он проходит.

(Я не понимаю, почему вы так обеспокоены зависимостью от System.web.dll)

Ответ 6

У вас уже есть ОГРОМНАЯ зависимость от .NET framework, CLR etal. Таким образом, на самом деле у вас уже есть косвенная зависимость от System.Web.DLL; ваше приложение НЕ МОЖЕТ РАБОТАТЬ без его присутствия на локальной машине.

И ты беспокоишься о памяти? У вас проблемы с памятью? Если у вас проблемы с памятью настолько экстремальные, вы не можете загрузить несколько KBs DLL в свою память приложения, то почему вы кодируете .NET? Или вы только преждевременно оптимизируете?

Так что не беспокойтесь об этом.

Ответ 7

Просто немного понимания того, почему это отличается. Был преобразован в верхний регистр и один преобразуется в нижний регистр. Таким образом, декодирование зависит от типа кодирования.

System.Net.WebUtility (внутренний) + 65:

private static char IntToHex(int n)
{
    if (n <= 9)
        return (char) (n + 48);
    else
        return (char) (n - 10 + 65);
}

System.Web.Util.HttpEncoderUtility (Internal) - + 97

public static char IntToHex(int n)
{
    if (n <= 9)
        return (char) (n + 48);
    else
        return (char) (n - 10 + 97);
}

Пример:

var test1 = WebUtility.UrlEncode("http://www.test.com/?param1=22&[email protected]<a space");
var test2 = HttpUtility.UrlEncode("http://www.test.com/?param1=22&[email protected]<a space");

Ответ:

test1 -> http%3A%2F%2Fwww.test.com%2F%3Fparam1%3D22%26param2%3Dthere%40is%3Ca+space
test2 -> http%3a%2f%2fwww.test.com%2f%3fparam1%3d22%26param2%3dthere%40is%3ca+space

Дополнительная информация....

Ответ 8

System.Net.WebUtility.HtmlDecode также работает над профилем клиента .NET 4.0.