He hecho un poco de investigación durante el último día y creo que tengo algo de información sobre esto.
Cuando utiliza Request.Querystring o HttpUtility.UrlDecode (o Encode) está utilizando la codificación que se especifica en el elemento (específicamente el atributo requestEncoding) de la web.config (o la jerarquía .config si no la tiene) t especificado) --- NO la Codificación.Default que es la codificación predeterminada para su servidor.
Cuando tiene la codificación establecida en UTF-8, un único carácter Unicode se puede codificar como valores hexadecimales 2% xx. También se decodificará de esa manera cuando se le dé todo el valor.
Si utiliza UrlDecoding con una codificación diferente de la que se codificó con la url, obtendrá un resultado diferente.
Dado que HttpUtility.UrlEncode y UrlDecode pueden tomar un parámetro de codificación, es tentador intentar codificar usando una página de códigos ANSI, pero UTF-8 es el camino correcto si tiene soporte para el navegador (aparentemente las versiones antiguas no soporte UTF-8). Solo necesita asegurarse de que esté correctamente configurado y que ambos lados funcionen bien.
UTF-8 parece ser la codificación por defecto: (del reflector .net System.Web.HttpRequest)
internal Encoding QueryStringEncoding
{
get
{
Encoding contentEncoding = this.ContentEncoding;
if (!contentEncoding.Equals(Encoding.Unicode))
{
return contentEncoding;
}
return Encoding.UTF8;
}
}
Siguiendo el camino para averiguar la this.ContentEncoding que conduce a (también en 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);
}
}
Para responder a su pregunta específica sobre la diferencia Transcurrirá Request.Url.Quer y Request.QueryString ... aquí es cómo HttpRequest construye su dirección URL del inmueble:
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;
}
}
Puede ver que está utilizando la clase HttpEncoder para realizar la decodificación, pero utiliza el mismo valor QueryStringEncoding.
Dado que ya estoy publicando una gran cantidad de código aquí y cualquiera puede obtener .NET Reflector, voy a tomar el resto. La propiedad QueryString proviene de HttpValueCollection que utiliza el método FillFromEncodedBytes para eventualmente llamar a HttpUtility.UrlDecode (con el valor QueryStringEncoding establecido anteriormente), que finalmente llama al HttpEncoder para decodificarlo. Parece que usan una metodología diferente para decodificar los bytes reales de la cadena de consulta, pero la codificación que usan para hacerlo parece ser la misma.
Me resulta interesante que HttpEncoder tenga tantas funciones que parecen hacer lo mismo, por lo que es posible que haya diferencias en los métodos que pueden causar un problema.
Ambas propiedades devuelven la misma cadena codificada la mayor parte del tiempo; los constructores y el análisis son irrelevantes en este caso. Solo después de la llamada de reescritura cambia la codificación de Uri. – zombat
Tal vez su respuesta y la respuesta de womps a continuación combinados es la verdad. Quizás es el caso que uno conserva la codificación Url usando un código Latin-1 y el otro usa UTF-8. –