Ich habe ein wenig Forschung über den letzten Tag oder so getan, und ich denke, dass ich einige Informationen dazu habe.
Wenn Sie Request.Querystring oder HttpUtility.UrlDecode (oder Encode) verwenden, verwendet es die Codierung, die in dem Element (speziell dem Attribut requestEncoding) der Datei web.config (oder der .config-Hierarchie angegeben ist). t angegeben) --- NICHT die Encoding.Default, die die Standard-Codierung für Ihren Server ist.
Wenn die Codierung auf UTF-8 eingestellt ist, kann ein einzelnes Unicode-Zeichen als 2% xx-Hexadezimalwerte codiert werden. Es wird auch so dekodiert, wenn der gesamte Wert angegeben wird.
Wenn Sie UrlDecoding mit einer anderen Codierung verwenden als die URL, mit der codiert wurde, erhalten Sie ein anderes Ergebnis.
Da HttpUtility.UrlEncode und UrlDecode einen Codierungsparameter annehmen können, ist es verlockend zu versuchen, mit einer ANSI-Codepage zu kodieren, aber UTF-8 ist der richtige Weg, wenn Sie die Browserunterstützung haben (anscheinend alte Versionen nicht) Unterstützung UTF-8). Sie müssen nur sicherstellen, dass das richtig eingestellt ist und beide Seiten gut funktionieren.
UTF-8 scheint die Standard-Kodierung zu sein: (von .net Reflektor System.Web.HttpRequest)
internal Encoding QueryStringEncoding
{
get
{
Encoding contentEncoding = this.ContentEncoding;
if (!contentEncoding.Equals(Encoding.Unicode))
{
return contentEncoding;
}
return Encoding.UTF8;
}
}
dem Weg Nach dem this.ContentEncoding, um herauszufinden, führt zu (auch in 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);
}
}
Um Ihre Frage auf der Differenz betwen Request.Url.Quer und Request.QueryString zu beantworten ... hier ist, wie Httprequest seiner Eigenschaft URL baut:
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;
}
}
Sie können sehen, dass es die HttpEncoder-Klasse verwendet, um die Decodierung durchzuführen, aber es verwendet denselben QueryStringEncoding-Wert.
Da ich bereits eine Menge Code hier schreibe und jeder .NET Reflektor bekommen kann, werde ich den Rest entschlüsseln. Die QueryString-Eigenschaft stammt von der HttpValueCollection, die die FillFromEncodedBytes-Methode verwendet, um HttpUtility.UrlDecode (mit dem oben angegebenen QueryStringEncoding-Wert) aufzurufen, der schließlich den HttpEncoder aufruft, um es zu decodieren. Sie scheinen unterschiedliche Methoden zu verwenden, um die tatsächlichen Bytes der Querystring zu dekodieren, aber die Codierung, die sie verwenden, scheint die gleiche zu sein.
Es ist interessant für mich, dass der HttpEncoder hat so viele Funktionen, die das gleiche zu tun scheinen, so ist es möglich, gibt es Unterschiede in diesen Methoden, die ein Problem verursachen können.
Beide Eigenschaften geben die gleiche codierte Zeichenfolge die meiste Zeit zurück - die Konstruktoren und die Analyse sind in diesem Fall irrelevant. Erst nach dem Rewrite-Aufruf ändert sich die Codierung des Uri. – zombat
Vielleicht ist Ihre Antwort und Womps unten kombiniert die Wahrheit. Vielleicht bewahrt man die Url-Codierung mit einem Latin-1-Code, während die andere UTF-8 verwendet. –