System.Web का उपयोग किए बिना आप UrlEncode कैसे करते हैं?


310

मैं एक विंडोज़ क्लाइंट एप्लिकेशन लिखने की कोशिश कर रहा हूं जो डेटा के लिए एक वेब साइट कहता है। इंस्टॉल को न्यूनतम रखने के लिए मैं केवल .NET फ्रेमवर्क क्लाइंट प्रोफाइल में dlls का उपयोग करने का प्रयास कर रहा हूं । परेशानी यह है कि मुझे कुछ मापदंडों की आवश्यकता है, कुछ मापदंडों को आयात किए बिना ऐसा करने का एक आसान तरीका है। We.dll, जो क्लाइंट Pofile का हिस्सा नहीं है?


क्या आप दिखा सकते हैं कि आप वेब साइट पर कॉल कैसे कर रहे हैं? शायद वहाँ कुछ है जो वहाँ किया जा सकता है।
डारिन दिमित्रोव 15

जिज्ञासा से बाहर, आप System.Web का उपयोग किए बिना डेटा के लिए एक वेबसाइट कैसे कहते हैं?
पैट्रिक मैकडोनाल्ड

@ पैट्रिक, वह शायद उपयोग कर रहा है WebRequestया WebClient। यही कारण है कि मैंने इस विशेष कोड के बारे में पूछा क्योंकि ऐसी चीजें हैं जो ठीक से यूआरएल एन्कोडिंग डेटा के बारे में किया जा सकता है।
डारिन दिमित्रोव

1
मैं एक System.Net.ebRequest ऑब्जेक्ट का उपयोग कर रहा हूं। तब मैं GetRequestStream को कॉल करता हूं और अपने पोस्ट मापदंडों को स्ट्रीम पर लिखता हूं। मैंने ContentType को "application / x-www-form-urlencoded" पर भी सेट किया है।
मार्टिन ब्राउन

1
निश्चित रूप से यह समान रूप से अच्छी तरह से लागू होगा यदि मैं GET अनुरोध कर रहा था और URL में पैरामीटर जोड़ रहा था।
मार्टिन ब्राउन

जवाबों:


317

System.Uri.EscapeUriString() कुछ पात्रों के साथ समस्याग्रस्त हो सकता है, मेरे लिए यह स्ट्रिंग में एक संख्या / पाउंड '#' चिन्ह था।

यदि वह आपके लिए एक समस्या है, तो प्रयास करें:

System.Uri.EscapeDataString() //Works excellent with individual values

यहाँ एक SO प्रश्न उत्तर है जो अंतर बताता है:

एस्केप यूरीस्ट्रिंग और एस्केपडैटस्ट्रिंग में क्या अंतर है?

और Uri.EscapeDataString()किसी भी सूरत में उपयोग करने की सिफारिश करता है ।


1
गलत: blogs.msdn.com/b/yangxind/archive/2006/11/09/… आपको प्लस साइन्स की समस्या होगी क्योंकि वे अनएन्कोडेड नहीं होंगे।
क्रिस वेबर

7
वह ब्लॉग पोस्ट थोड़ी पुरानी है और मेरे पास बस "उरी एस्केप" एक पूर्ण यूआरएल है और सभी रिक्त स्थान 20% हो गए हैं, इसलिए मुझे लगता है कि उन्होंने इसे तय किया है। मैं .net 4.5 का उपयोग कर रहा हूं।
रोडी

यदि आप किसी POST ऑपरेशन के लिए डेटा तैयार कर रहे हैं, तो एस्केपडाटास्ट्रिंग बहुत लंबे तार का समर्थन नहीं करता है। stackoverflow.com/questions/6695208/…
ब्रॉन डेविस

Uri.EscapeUriStringवास्तव में बहुत समस्याग्रस्त है और इसका उपयोग नहीं किया जाना चाहिए, क्योंकि यह कुछ करने की कोशिश करता है (पूर्ण यूआरआई से बचने) जो वास्तव में लगातार करना असंभव है विस्तृत विवरण के लिए इस उत्तर को देखें ।
Livven

इसके अलावा एक '' अंतरिक्ष चरित्र।
वकास शब्बीर

252

InNet 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

InNet 4.5+ का उपयोग करें WebUtility.UrlEncode

यह HttpUtility.UrlEncodeअधिक सामान्य वर्णों के लिए प्रतिकृति (पूर्व- v4.0) प्रतीत होता है :
Uri.EscapeDataString(testString).Replace("%20", "+").Replace("'", "%27").Replace("~", "%7E")
नोट: EscapeUriStringएक मान्य यूआरआई स्ट्रिंग रखेगा, जिसके कारण संभव के रूप में कई प्लेटेक्स्ट पात्रों का उपयोग किया जा सकता है।

विभिन्न एन्कोडिंग्स की तुलना करने वाली तालिका के लिए यह उत्तर देखें:
https://stackoverflow.com/a/11236038/555798

लाइन ब्रेक्स उन सभी को यहां सूचीबद्ध किया गया है (के अलावा HttpUtility.HtmlEncode) "\n\r"में %0a%0dया में परिवर्तित हो जाएगा%0A%0D

कृपया इसे संपादित करने और मेरे परीक्षण स्ट्रिंग में नए वर्ण जोड़ने के लिए स्वतंत्र महसूस करें, या उन्हें टिप्पणियों में छोड़ दें और मैं इसे संपादित करूंगा।


मेरे मामले में मुझे इसके EscapeDataStringबजाय उपयोग करना था EscapeUriStringक्योंकि हम गाड़ी के रिटर्न और लाइन फीड को एन्कोडिंग कर रहे थे और इसके लिए अधिक आक्रामक भागने की आवश्यकता थीEscapeDataString
डेविड ओ'मैरा

1
अधिक उदाहरण, यदि आप चाहें तो आप अपने स्वयं के परीक्षण के मामले प्रदान कर सकते हैं। यहाँ इसे चलाने का एक नमूना है और अन्य एन्कोडिंग विधियाँ जो अंतर दिखाती हैं dotnetfiddle.net/12IFw1
Maslow

3
WebUtility.UrlEncode () और WebUtility.UrlDecode () 4.5+ हैं। वे 4.0 में मौजूद नहीं हैं।
डेरेक कल्वेइट

एमएसडीएन कहता है: "यूनिवर्सल विंडोज प्लेटफॉर्म: 4.5 से उपलब्ध है। .NET फ्रेमवर्क: 4.0 से उपलब्ध है" ...
Thymine

54

आप उपयोग कर सकते हैं

Uri.EscapeUriString ( http://msdn.microsoft.com/en-us/library/system.uri.escapeuristring.aspx देखें )


क्या इस और एस्केपड्रास्ट्रिंग के बीच कोई अंतर है?
मार्टिन ब्राउन

3
आप EscapeUriString का उपयोग करना चाहते हैं। एस्केपयूरीस्ट्रिंग पूरे url को एनकोड करने की कोशिश करेगा (http: // भाग को शामिल करें) जबकि एस्केपयूरीस्ट्रिंग समझता है कि वास्तव में किन हिस्सों को एन्कोड किया जाना चाहिए
मैथ्यू मनीला

1
मैं देख रहा हूं, इसलिए इस उदाहरण में मैं शायद एस्केपड्रास्ट्रिंग करना चाहता हूं क्योंकि मैं एक पैरामीटर के रूप में एक URL पास करना चाहता हूं। मैं इस उदाहरण में एक URL से जुड़ रहा हूं।
मार्टिन ब्राउन

5
@MatthewManela मुझे पूरा यकीन है कि आपकी Oct1 टिप्पणी को पढ़ना चाहिए । TheDataDataString सांकेतिक शब्दों में बदलना करने की कोशिश करेगा ...
Maslow

उपयोग न करें Uri.EscapeUriString। यह "समझ" नहीं करता है कि किन हिस्सों को एन्कोड किया जाना चाहिए, यह केवल कुछ करने (पूर्ण यूआरआई से बचने) पर एक गुमराह करने का प्रयास है जो वास्तव में लगातार करना असंभव है। विस्तृत विवरण के लिए इस उत्तर को देखें ।
Livven

20

यहाँ उत्तर बहुत अच्छे हैं, लेकिन फिर भी मेरे लिए अपर्याप्त हैं।

मैंने एक छोटा सा लूप लिखा है जो 0 से 255 तक सभी पात्रों के Uri.EscapeUriStringसाथ तुलना करता है Uri.EscapeDataString

नोट: दोनों फ़ंक्शन में अंतर्निहित इंटेलिजेंस है कि 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"
.....

EscapeUriStringURL को एन्कोड करने के लिए उपयोग किया जाना है, जबकि EscapeDataStringइसका उपयोग कुकी की सामग्री को उदाहरण के लिए एन्कोड करने के लिए किया जाना है, क्योंकि कुकी डेटा में आरक्षित वर्ण '='और नहीं होने चाहिए ';'


यहाँ अच्छा विश्लेषण और ब्रेकडाउन, बहुत उपयोगी है। अगर किसी के पास या प्रदर्शन बेंचमार्क (सभी तीन तरीकों की तुलना) का पता है, तो यह देखना भी अच्छा होगा
शॉन विल्सन

यह एक अच्छा विश्लेषण है और takeaway यह है कि आपको उपयोग नहीं करना चाहिए Uri.EscapeUriString, क्योंकि पूर्ण URI से बचना लगातार करना असंभव है। विस्तृत विवरण के लिए इस उत्तर को देखें ।
Livven

16

क्लाइंट प्रोफाइल System.dll में मौजूद क्लाइंट प्रोफाइल प्रयोग करने योग्य संस्करण, System.Net.WebUtility क्लास है। यहाँ MSDN लिंक है:

WebUtility


मैं ध्यान देता हूं कि उस वर्ग के लिए सहायता पृष्ठ विशेष रूप से कहता है "वेब अनुरोध संसाधित करते समय URL एन्कोडिंग और डिकोडिंग के लिए तरीके प्रदान करता है।" इसलिए यह सिर्फ इतना हो सकता है कि वे तरीकों को अच्छी तरह से नाम नहीं देते हैं।
जेम्स व्हाइट

अच्छी बात है, कहते हैं, आप भाई को वोट क्यों नहीं देते?) यह डाउन वोट मुझे 2 साल से परेशान कर रहा है। जेके ... लेकिन ईमानदारी से शायद यही कारण है कि मैंने लिंक पोस्ट किया, दुर्भाग्यपूर्ण है कि मैं माइक्रोसॉफ्ट के डॉक्स में त्रुटियों के लिए एक प्रतिष्ठा हिट लेता हूं ...
'16

11
ऐसा लगता है कि UrlEncode और UrlDecode केवल WebUtility के साथ .net के 4.5 संस्करण में जोड़े गए थे।
मार्टिन ब्राउन

8

यहां 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);
}


-3
System.Net.WebUtility.HtmlDecode

WebUtility Class वेब अनुरोधों को संसाधित करते समय URL को एन्कोडिंग और डिकोड करने के लिए तरीके प्रदान करता है। यह HttpUtility के रूप में एक ही बात करता है, लेकिन यह System.Web नाम स्थान से बाहर है
अलेक्जेंड्रू अलीउ

3
यह गलत है क्योंकि यह HtmlDecodes और पूछे गए प्रश्न की तरह UrlEncode नहीं है। यहां तक ​​कि HTML एन्कोडिंग भी गलत होगी क्योंकि HTML एन्कोडिंग URL एन्कोडिंग के लिए अलग है।
मार्टिन ब्राउन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.