मैंने पिछले दिन या तो कुछ शोध किया है और मुझे लगता है कि मेरे पास इस बारे में कुछ जानकारी है।
जब आप Request.Querystring या HttpUtility.UrlDecode (या एन्कोड) का उपयोग करते हैं तो यह web.config (या .config पदानुक्रम 'के तत्व में निर्दिष्ट एन्कोडिंग (विशेष रूप से अनुरोध एन्कोडिंग विशेषता) का उपयोग कर रहा है। टी निर्दिष्ट) --- एन्कोडिंग नहीं। डीफॉल्ट जो आपके सर्वर के लिए डिफ़ॉल्ट एन्कोडिंग है।
जब आपके पास यूटीएफ -8 में एन्कोडिंग सेट होता है, तो एक यूनिकोड चरित्र को 2% xx हेक्स मानों के रूप में एन्कोड किया जा सकता है। पूरे मूल्य को देखते समय इसे भी डीकोड किया जाएगा।
यदि आप यूआरएल की तुलना में एक अलग एन्कोडिंग के साथ UrlDecoding हैं, तो आपको एक अलग परिणाम मिलेगा।
के बाद से HttpUtility.UrlEncode और UrlDecode कोई एन्कोडिंग पैरामीटर ले जा सकते हैं, अपने आकर्षक एक एएनएसआई कोडपेज का उपयोग कर सांकेतिक शब्दों में बदलना करने की कोशिश करने के लिए है, लेकिन UTF-8 यदि आप ब्राउज़र समर्थन जाने के लिए सही रास्ता है (जाहिरा तौर पर पुराने संस्करणों नहीं है यूटीएफ -8 का समर्थन करें)। आपको बस यह सुनिश्चित करने की ज़रूरत है कि ठीक से सेट किया गया है और दोनों पक्ष ठीक काम करेंगे।
UTF-8 डिफ़ॉल्ट एन्कोडिंग लगता है: पता लगाने के लिए this.ContentEncoding में ले जाता है (.net परावर्तक System.Web.HttpRequest से)
internal Encoding QueryStringEncoding
{
get
{
Encoding contentEncoding = this.ContentEncoding;
if (!contentEncoding.Equals(Encoding.Unicode))
{
return contentEncoding;
}
return Encoding.UTF8;
}
}
पथ के बाद (भी HttpRequest)
public Encoding ContentEncoding
{
get
{
if (!this._flags[0x20] || (this._encoding == null))
{
this._encoding = this.GetEncodingFromHeaders();
if (this._encoding == null)
{
GlobalizationSection globalization = RuntimeConfig.GetLKGConfig(this._context).Globalization;
this._encoding = globalization.RequestEncoding;
}
this._flags.Set(0x20);
}
return this._encoding;
}
set
{
this._encoding = value;
this._flags.Set(0x20);
}
}
Request.Url.Quer और Request.QueryString betwen अंतर पर अपने विशिष्ट सवाल का जवाब करने के लिए ... यहाँ है कैसे HttpRequest अपने यूआरएल संपत्ति बनाता है:
public Uri Url
{
get
{
if ((this._url == null) && (this._wr != null))
{
string queryStringText = this.QueryStringText;
if (!string.IsNullOrEmpty(queryStringText))
{
queryStringText = "?" + HttpEncoder.CollapsePercentUFromStringInternal(queryStringText, this.QueryStringEncoding);
}
if (AppSettings.UseHostHeaderForRequestUrl)
{
string knownRequestHeader = this._wr.GetKnownRequestHeader(0x1c);
try
{
if (!string.IsNullOrEmpty(knownRequestHeader))
{
this._url = new Uri(this._wr.GetProtocol() + "://" + knownRequestHeader + this.Path + queryStringText);
}
}
catch (UriFormatException)
{
}
}
if (this._url == null)
{
string serverName = this._wr.GetServerName();
if ((serverName.IndexOf(':') >= 0) && (serverName[0] != '['))
{
serverName = "[" + serverName + "]";
}
this._url = new Uri(this._wr.GetProtocol() + "://" + serverName + ":" + this._wr.GetLocalPortAsString() + this.Path + queryStringText);
}
}
return this._url;
}
}
आप देख सकते हैं कि यह डिकोडिंग करने के लिए HttpEncoder क्लास का उपयोग कर रहा है, लेकिन यह एक ही QueryStringEncoding मान का उपयोग करता है।
चूंकि मैं पहले से ही बहुत सारे कोड पोस्ट कर रहा हूं और कोई भी .NET परावर्तक प्राप्त कर सकता है, मैं बाकी को स्निपेट करने जा रहा हूं। QueryString प्रॉपर्टी HttpValueCollection से आता है जो अंततः HttpUtility.UrlDecode (ऊपर QueryStringEncoding मान सेट के साथ) को कॉल करने के लिए FillFromEncodedBytes विधि का उपयोग करता है, जो अंततः HttpEncoder को डीकोड करने के लिए कहते हैं। वे क्वेरीस्ट्रिंग के वास्तविक बाइट्स को डीकोड करने के लिए विभिन्न पद्धतियों का उपयोग करते प्रतीत होते हैं, लेकिन ऐसा करने के लिए वे एन्कोडिंग का उपयोग करते हैं, ऐसा लगता है।
यह मेरे लिए दिलचस्प है कि एचटीपीएनकोडर में इतने सारे काम हैं जो एक ही काम करते हैं, इसलिए संभव है कि उन तरीकों में मतभेद हैं जो किसी समस्या का कारण बन सकते हैं।
दोनों गुण एक ही एन्कोडेड स्ट्रिंग को अधिकांश समय लौटाते हैं - कन्स्ट्रक्टर और पार्सिंग इस मामले में अप्रासंगिक हैं। यह फिर से लिखने के बाद है कि उरी के एन्कोडिंग में बदलाव आया है। – zombat
शायद आपके उत्तर और गर्भ संयुक्त नीचे जवाब सच है। शायद यह मामला है कि एक लैटिन -1 कोड का उपयोग करते हुए यूआरएल एन्कोडिंग को संरक्षित करता है और दूसरा यूटीएफ -8 का उपयोग करता है। –