سؤال

أحاول كتابة تطبيق 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:

WebUtility

فيما يلي مثال على إرسال طلب منشور يقوم بتشفير المعلمات بشكل صحيح باستخدام 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top