كيف يمكنك urlencode دون استخدام system.web؟
-
27-09-2019 - |
سؤال
أحاول كتابة تطبيق Windows Client الذي يتصل بموقع ويب للبيانات. للحفاظ على التثبيت إلى الحد الأدنى الذي أحاول استخدامه فقط DLLS في ملف تعريف عميل إطار عمل .NET. المشكلة هي أنني بحاجة إلى urlencode بعض المعلمات ، هل هناك طريقة سهلة للقيام بذلك دون استيراد system.web.dll الذي ليس جزءًا من العميل pofile؟
المحلول
System.Uri.EscapeUriString()
يمكن أن تكون مشكلة مع شخصيات معينة ، بالنسبة لي كان علامة / جنيه "#" في السلسلة.
إذا كانت هذه مشكلة بالنسبة لك ، فحاول:
System.Uri.EscapeDataString() //Works excellent with individual values
فيما يلي إجابة سؤال تفسر الفرق:
ما هو الفرق بين Escapeuristring و Depedatchastring؟
ويوصي بالاستخدام 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
(prev4.0) للشخصيات الأكثر شيوعا:
Uri.EscapeDataString(testString).Replace("%20", "+").Replace("'", "%27").Replace("~", "%7E")
ملحوظة: EscapeUriString
سيحتفظ بسلسلة URI صالحة ، مما يؤدي إلى استخدام أكبر عدد ممكن من أحرف النص العادي.
انظر هذه الإجابة لجدول يقارن الترميزات المختلفة:
https://stackoverflow.com/a/11236038/555798
فواصل الأسطركلهم مدرجون هنا (بخلاف ذلك 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
يجب استخدامه لتشفير على سبيل المثال محتوى ملف تعريف الارتباط ، لأن بيانات ملفات تعريف الارتباط يجب ألا تحتوي على الأحرف المحجوزة '='
و ';'
.
هناك نسخة قابلة للاستخدام في ملف تعريف العميل ، system.net.webutility فئة ، موجودة في ملف تعريف العميل system.dll. هذا هو رابط MSDN:
فيما يلي مثال على إرسال طلب منشور يقوم بتشفير المعلمات بشكل صحيح باستخدام 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-httputily-urlencode/
System.Net.WebUtility.HtmlDecode