Как вы UrlEncode без использования System.Web?
Я пытаюсь написать клиентское приложение Windows, которое вызывает веб-сайт для данных. Чтобы свести установку к минимуму, я пытаюсь использовать только dll в.NET Framework Client Profile. Проблема в том, что мне нужно UrlEncode некоторых параметров, есть ли простой способ сделать это без импорта System.Web.dll, который не является частью Client Pofile?
9 ответов
System.Uri.EscapeUriString()
может быть проблематично с определенными символами, для меня это был знак числа / фунта '#' в строке.
Если это проблема для вас, попробуйте:
System.Uri.EscapeDataString() //Works excellent with individual values
Вот так ответ на вопрос, который объясняет разницу:
В чем разница между EscapeUriString и EscapeDataString?
и рекомендует использовать Uri.EscapeDataString()
в любом аспекте.
В.Net 4.5+ используют WebUtility
Просто для форматирования я отправляю это как ответ.
Не могу найти хороших примеров, сравнивающих их так:
string testString = "http://test# space 123/text?var=val&another=two";
Console.WriteLine("UrlEncode: " + System.Web.HttpUtility.UrlEncode(testString));
Console.WriteLine("EscapeUriString: " + Uri.EscapeUriString(testString));
Console.WriteLine("EscapeDataString: " + Uri.EscapeDataString(testString));
Console.WriteLine("EscapeDataReplace: " + Uri.EscapeDataString(testString).Replace("%20", "+"));
Console.WriteLine("HtmlEncode: " + System.Web.HttpUtility.HtmlEncode(testString));
Console.WriteLine("UrlPathEncode: " + System.Web.HttpUtility.UrlPathEncode(testString));
//.Net 4.0+
Console.WriteLine("WebUtility.HtmlEncode: " + WebUtility.HtmlEncode(testString));
//.Net 4.5+
Console.WriteLine("WebUtility.UrlEncode: " + WebUtility.UrlEncode(testString));
Выходы:
UrlEncode: http%3a%2f%2ftest%23+space+123%2ftext%3fvar%3dval%26another%3dtwo
EscapeUriString: http://test#%20space%20123/text?var=val&another=two
EscapeDataString: http%3A%2F%2Ftest%23%20space%20123%2Ftext%3Fvar%3Dval%26another%3Dtwo
EscapeDataReplace: http%3A%2F%2Ftest%23+space+123%2Ftext%3Fvar%3Dval%26another%3Dtwo
HtmlEncode: http://test# space 123/text?var=val&another=two
UrlPathEncode: http://test#%20space%20123/text?var=val&another=two
//.Net 4.0+
WebUtility.HtmlEncode: http://test# space 123/text?var=val&another=two
//.Net 4.5+
WebUtility.UrlEncode: http%3A%2F%2Ftest%23+space+123%2Ftext%3Fvar%3Dval%26another%3Dtwo
В.Net 4.5+ используют WebUtility
.UrlEncode
Это похоже на репликацию HttpUtility.UrlEncode
(до v4.0) для более распространенных символов: Uri.EscapeDataString(testString).Replace("%20", "+").Replace("'", "%27").Replace("~", "%7E")
Замечания: EscapeUriString
сохранит допустимую строку URI, в результате чего будет использоваться как можно больше символов открытого текста.
Смотрите этот ответ для таблицы, сравнивающей различные кодировки:
/questions/48018050/kodirovanie-url-s-ispolzovaniem-c/48018100#48018100
Все разрывы строк перечислены здесь (кроме HttpUtility.HtmlEncode
) будет конвертировать "\n\r"
в %0a%0d
или же %0A%0D
Пожалуйста, не стесняйтесь редактировать это и добавлять новые символы в мою тестовую строку, или оставить их в комментариях, и я отредактирую это.
Ты можешь использовать
Uri.EscapeUriString (см. Http://msdn.microsoft.com/en-us/library/system.uri.escapeuristring.aspx)
Ответы здесь очень хорошие, но все же недостаточны для меня.
Я написал небольшой цикл, который сравнивает Uri.EscapeUriString
с Uri.EscapeDataString
для всех символов от 0 до 255.
ПРИМЕЧАНИЕ. Обе функции имеют встроенный интеллект: символы выше 0x80 сначала кодируются в кодировке UTF-8, а затем кодируются в процентах.
Вот результат:
******* Different *******
'#' -> Uri "#" Data "%23"
'$' -> Uri "$" Data "%24"
'&' -> Uri "&" Data "%26"
'+' -> Uri "+" Data "%2B"
',' -> Uri "," Data "%2C"
'/' -> Uri "/" Data "%2F"
':' -> Uri ":" Data "%3A"
';' -> Uri ";" Data "%3B"
'=' -> Uri "=" Data "%3D"
'?' -> Uri "?" Data "%3F"
'@' -> Uri "@" Data "%40"
******* Not escaped *******
'!' -> Uri "!" Data "!"
''' -> Uri "'" Data "'"
'(' -> Uri "(" Data "("
')' -> Uri ")" Data ")"
'*' -> Uri "*" Data "*"
'-' -> Uri "-" Data "-"
'.' -> Uri "." Data "."
'_' -> Uri "_" Data "_"
'~' -> Uri "~" Data "~"
'0' -> Uri "0" Data "0"
.....
'9' -> Uri "9" Data "9"
'A' -> Uri "A" Data "A"
......
'Z' -> Uri "Z" Data "Z"
'a' -> Uri "a" Data "a"
.....
'z' -> Uri "z" Data "z"
******* UTF 8 *******
.....
'Ò' -> Uri "%C3%92" Data "%C3%92"
'Ó' -> Uri "%C3%93" Data "%C3%93"
'Ô' -> Uri "%C3%94" Data "%C3%94"
'Õ' -> Uri "%C3%95" Data "%C3%95"
'Ö' -> Uri "%C3%96" Data "%C3%96"
.....
EscapeUriString
должен использоваться для кодирования URL, в то время как EscapeDataString
должен использоваться для кодирования, например, содержимого Cookie, потому что данные Cookie не должны содержать зарезервированных символов '='
а также ';'
,
В клиентском профиле System.dll есть доступная версия профиля клиента, класс System.Net.WebUtility. Вот ссылка MSDN:
Вот пример отправки запроса POST, который правильно кодирует параметры, используя application/x-www-form-urlencoded
Тип содержимого:
using (var client = new WebClient())
{
var values = new NameValueCollection
{
{ "param1", "value1" },
{ "param2", "value2" },
};
var result = client.UploadValues("http://foo.com", values);
}
Чтобы UrlEncode без использования System.Web:
String s = System.Net.WebUtility.UrlEncode(str);
//fix some different between WebUtility.UrlEncode and HttpUtility.UrlEncode
s = Regex.Replace(s, "(%[0-9A-F]{2})", c => c.Value.ToLowerInvariant());
более подробная информация: https://www.samnoble.co.uk/2014/05/21/beware-webutility-urlencode-vs-httputility-urlencode/
Я был вынужден использовать .NET 4.0 для некоторых проектов, которые я создал, и из-за этого ни
WebUtility
ни
HttpUtility
будет содержать их. я использовал
Uri.EscapeDataString()
метод, который работает очень хорошо, но мне не понравился тот факт, что он не кодирует все стандартные специальные символы (имеется в виду
! "#$%&'()*+,-./:;<=>?@[\]^_`{|}~
) на одном дыхании. Я также больше имею дело с Visual Basic, чем с C#, поэтому я не знаю наверняка, что потребуется для преобразования следующего, но он отлично подходит для моих основных нужд.
Я не буду иметь дело с какими-либо строками в формате UTF-8, поскольку он используется только для некоторых очень простых манипуляций с текстом и до сих пор хорошо служил мне. Он никоим образом не будет анализировать разрывы строк (в тексте, с которым я работаю, их не будет), и вам придется обрабатывать
%
сначала знак, чтобы он не испортил кодировку остальных символов. Немного кричаще, но работает.
Function EncodeURL(ByVal DecodedString As String) As String
DecodedString = Replace(DecodedString, "%", "%25", 1, vbTextCompare)
DecodedString = Replace(DecodedString, " ", "%20", 1, vbTextCompare)
DecodedString = Replace(DecodedString, "!", "%21", 1, vbTextCompare)
DecodedString = Replace(DecodedString, """", "%22", 1, vbTextCompare)
DecodedString = Replace(DecodedString, "#", "%23", 1, vbTextCompare)
DecodedString = Replace(DecodedString, "$", "%24", 1, vbTextCompare)
DecodedString = Replace(DecodedString, "&", "%26", 1, vbTextCompare)
DecodedString = Replace(DecodedString, "'", "%27", 1, vbTextCompare)
DecodedString = Replace(DecodedString, "(", "%28", 1, vbTextCompare)
DecodedString = Replace(DecodedString, ")", "%29", 1, vbTextCompare)
DecodedString = Replace(DecodedString, "*", "%2A", 1, vbTextCompare)
DecodedString = Replace(DecodedString, "+", "%2B", 1, vbTextCompare)
DecodedString = Replace(DecodedString, ",", "%2C", 1, vbTextCompare)
DecodedString = Replace(DecodedString, "-", "%2D", 1, vbTextCompare)
DecodedString = Replace(DecodedString, ".", "%2E", 1, vbTextCompare)
DecodedString = Replace(DecodedString, "/", "%2F", 1, vbTextCompare)
DecodedString = Replace(DecodedString, ":", "%3A", 1, vbTextCompare)
DecodedString = Replace(DecodedString, ";", "%3B", 1, vbTextCompare)
DecodedString = Replace(DecodedString, "<", "%3C", 1, vbTextCompare)
DecodedString = Replace(DecodedString, "=", "%3D", 1, vbTextCompare)
DecodedString = Replace(DecodedString, ">", "%3E", 1, vbTextCompare)
DecodedString = Replace(DecodedString, "?", "%3F", 1, vbTextCompare)
DecodedString = Replace(DecodedString, "@", "%40", 1, vbTextCompare)
DecodedString = Replace(DecodedString, "[", "%5B", 1, vbTextCompare)
DecodedString = Replace(DecodedString, "\", "%5C", 1, vbTextCompare)
DecodedString = Replace(DecodedString, "]", "%5D", 1, vbTextCompare)
DecodedString = Replace(DecodedString, "^", "%5E", 1, vbTextCompare)
DecodedString = Replace(DecodedString, "_", "%5F", 1, vbTextCompare)
DecodedString = Replace(DecodedString, "`", "%60", 1, vbTextCompare)
DecodedString = Replace(DecodedString, "{", "%7B", 1, vbTextCompare)
DecodedString = Replace(DecodedString, "|", "%7C", 1, vbTextCompare)
DecodedString = Replace(DecodedString, "}", "%7D", 1, vbTextCompare)
DecodedString = Replace(DecodedString, "~", "%7E", 1, vbTextCompare)
EncodeURL = DecodedString
End Function
Вход:
! "#$%&'()*+,-./:;<=>?@[]^_`{|}~
Выход
%21%20%22%23%24%25%26%27%28%29%2A%2B%2C%2D%2E%2F%3A%3B%3C%3D%3E%3F%40%5B%5C%5D%5E%5F%60%7B%7C%7D%7E