जवाबों:
HttpServerUtility.UrlEncodeHttpUtility.UrlEncodeआंतरिक रूप से उपयोग करेगा । कोई विशेष अंतर नहीं है। अस्तित्व का कारण Server.UrlEncodeक्लासिक एएसपी के साथ संगतता है।
मेरे पास इन तरीकों के साथ महत्वपूर्ण सिरदर्द थे, मैं आपको किसी भी प्रकार के संस्करण से बचने की सलाह देता हूं UrlEncode, और इसके बजायUri.EscapeDataString - कम से कम उस व्यक्ति के पास एक व्यावहारिक व्यवहार है।
चलो देखते हैं...
HttpUtility.UrlEncode(" ") == "+" //breaks ASP.NET when used in paths, non-
//standard, undocumented.
Uri.EscapeUriString("a?b=e") == "a?b=e" // makes sense, but rarely what you
// want, since you still need to
// escape special characters yourself
लेकिन मेरा व्यक्तिगत पसंदीदा HttpUtility.UrlPathEncode हो गया है - यह बात वास्तव में समझ से बाहर है। यह एन्कोड करता है:
इसमें लवली विशिष्ट MSDN दस्तावेज़ीकरण भी है "वेब क्लाइंट से क्लाइंट के लिए विश्वसनीय HTTP ट्रांसमिशन के लिए URL स्ट्रिंग के पथ भाग को एन्कोड करता है।" - वास्तव में यह बताए बिना कि यह क्या करता है। तुम एक Uzi के साथ पैर में खुद को गोली मारने की संभावना कम है ...
संक्षेप में, Uri.EscapeDataString से चिपके रहें ।
?और जो यह कहना चाहते हैं कि इनकोडिंग करना है और जो विभाजक के रूप में काम करते हैं? अंतरिक्ष की तरह: दोनों स्थितियों में अंतरिक्ष हैश में है, इसलिए क्वेरी-खंड की मौजूदगी या अनुपस्थिति कोई मायने नहीं रखती। और अंत में, यह उड़ी को भ्रष्ट करने के लिए अक्षम्य है जैसा कि दूसरे उदाहरण में% है। UrlPathEncodeविधि सादे borked है और कभी नहीं किया जाना चाहिए।
यह पूछे जाने के लगभग 9 साल बाद फास्ट-फ़ॉरवर्ड, और .NET कोर और .NET मानक की दुनिया में, यह लगता है कि URL-एन्कोडिंग के लिए हमारे पास सबसे आम विकल्प हैं WebUtility.UrlEncode (अंडर System.Net) और Uri.EscapeaataString । यहां और अन्य जगहों पर सबसे लोकप्रिय जवाब को देखते हुए, Uri.EscapeDataString बेहतर प्रतीत होता है। पर है क्या? मैंने मतभेदों को समझने के लिए कुछ विश्लेषण किया और यहाँ बताया गया है कि मैं क्या कर रहा हूँ:
WebUtility.UrlEncodeके रूप में अंतरिक्ष encodes +; Uri.EscapeDataStringके रूप में यह सांकेतिक शब्दों में बदलना %20।Uri.EscapeDataStringप्रतिशत-एन्कोड !, (, ), और *; WebUtility.UrlEncodeनहीं करता।WebUtility.UrlEncodeप्रतिशत-एन्कोड ~; Uri.EscapeDataStringनहीं करता।Uri.EscapeDataStringUriFormatException65,520 वर्णों से अधिक लंबे तार पर फेंकता है ; WebUtility.UrlEncodeनहीं करता। ( आपके द्वारा सोचने की तुलना में एक अधिक सामान्य समस्या, विशेष रूप से URL-एन्कोडेड फॉर्म डेटा के साथ काम करते समय ।)Uri.EscapeDataStringउच्च सरोगेट पात्रोंUriFormatException पर फेंकता है ; नहीं करता। (यह एक UTF-16 बात है, शायद बहुत कम आम है।)WebUtility.UrlEncodeURL-एन्कोडिंग उद्देश्यों के लिए, वर्ण 3 श्रेणियों में से एक में फिट होते हैं: अनारक्षित (एक URL में कानूनी); सुरक्षित (में कानूनी लेकिन, विशेष अर्थ नहीं है तो तुम हो सकता है यह सांकेतिक शब्दों में बदलना चाहते हैं); और सब कुछ (हमेशा एन्कोडेड होना चाहिए)।
RFC के अनुसार , आरक्षित वर्ण हैं::/?#[]@!$&'()*+,;=
और अनारक्षित वर्ण अल्फ़ान्यूमेरिक हैं और -._~
Uri.EscapeDataString स्पष्ट रूप से अपने मिशन को परिभाषित करता है:% -encode सभी आरक्षित और अवैध वर्ण। WebUtility.UrlEncode परिभाषा और कार्यान्वयन दोनों में अधिक अस्पष्ट है। अजीब तरह से, यह कुछ आरक्षित वर्णों को एनकोड करता है लेकिन दूसरों को नहीं (क्यों कोष्ठक और कोष्ठक नहीं ??), और अजनबी अभी भी उस मासूम अनारक्षित ~चरित्र को एनकोड करता है ।
इसलिए, मैं लोकप्रिय सलाह के साथ सहमत हूं - जब संभव हो तो Uri.EscapeDataString का उपयोग करें , और समझें कि आरक्षित वर्ण जैसे /और ?एन्कोड हो जाएंगे। यदि आपको संभावित रूप से बड़े स्ट्रिंग से निपटने की आवश्यकता है, विशेष रूप से URL-एन्कोडेड फॉर्म सामग्री के साथ, तो आपको या तो WebUtility.UrlEncode पर वापस आना होगा और इसके क्वर्क्स को स्वीकार करना होगा, या अन्यथा समस्या के आसपास काम करना होगा।
संपादित करें: मैं कर दिया है की कोशिश की सभी quirks में उपरोक्त को सुधारने के लिए Flurl के माध्यम से Url.Encode, Url.EncodeIllegalCharactersऔर Url.Decodeस्थिर तरीके। ये मूल पैकेज में हैं (जो कि छोटा है और सभी HTTP सामान शामिल नहीं हैं), या स्रोत से उन्हें चीरने के लिए स्वतंत्र महसूस करें। मैं इन पर आपके द्वारा की गई किसी भी टिप्पणी / प्रतिक्रिया का स्वागत करता हूं।
यहाँ मैंने कोड का उपयोग किया है जो यह पता करता है कि कौन से वर्ण अलग-अलग एन्कोड किए गए हैं:
var diffs =
from i in Enumerable.Range(0, char.MaxValue + 1)
let c = (char)i
where !char.IsHighSurrogate(c)
let diff = new {
Original = c,
UrlEncode = WebUtility.UrlEncode(c.ToString()),
EscapeDataString = Uri.EscapeDataString(c.ToString()),
}
where diff.UrlEncode != diff.EscapeDataString
select diff;
foreach (var diff in diffs)
Console.WriteLine($"{diff.Original}\t{diff.UrlEncode}\t{diff.EscapeDataString}");
ध्यान रखें कि आप शायद उन विधियों में से किसी एक का उपयोग न करें। Microsoft की एंटी-क्रॉस साइट स्क्रिप्टिंग लाइब्रेरी में प्रतिस्थापन शामिल हैं HttpUtility.UrlEncodeऔर HttpUtility.HtmlEncodeयह दोनों अधिक मानक-अनुपालन, और अधिक सुरक्षित हैं। एक बोनस के रूप में, आपको एक JavaScriptEncodeविधि भी मिलती है ।