Pregunta

Tengo un proyecto web C # .net que tiene una etiqueta de globalización establecida en:

<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="nb-no" uiCulture="no"/>

Cuando esta URL es una aplicación Flash (tiene el mismo problema cuando ingresa la URL manualmente en un navegador): c_product_search.aspx? search = kj & # 248; kken (alternativamente: c_product_search-aspx? search = kj % F8kken

Ambos devuelven los siguientes códigos de caracteres:

k U+006b 107
j U+006a 106
� U+fffd 65533
k U+006b 107
k U+006b 107
e U+0065 101
n U+006e 110

No sé mucho sobre codificación de caracteres, pero parece que & # 248; se le ha dado un carácter de reemplazo unicode, ¿verdad?

Traté de cambiar la etiqueta de globalización a:

<globalization requestEncoding="iso-8859-1" responseEncoding="utf-8" culture="nb-no" uiCulture="no"/>

Eso hizo que la solicitud funcionara. Sin embargo, ahora, otras búsquedas en mi página dejaron de funcionar.

También probé lo siguiente con resultados similares:

NameValueCollection qs = HttpUtility.ParseQueryString(Request.QueryString.ToString(), Encoding.GetEncoding("iso-8859-1"));
string search = (string)qs["search"];

¿Qué debo hacer?

Saludos cordiales,

nitech

¿Fue útil?

Solución

El problema proviene de la combinación Firefox / Asp.Net. Cuando ingresó manualmente una URL en la barra de direcciones de Firefox, si la url contiene caracteres franceses o suecos, Firefox codificará la url con & Quot; ISO-8859-1 & Quot; por defecto.

Pero cuando asp.net recibe tal url, piensa que está codificado en utf-8 ... Y los caracteres codificados se convierten en " U + fffd " ;. No pude encontrar una manera en asp.net para detectar que la url es & Quot; ISO-8859-1 & Quot ;. Request.Encoding está configurado en utf-8 ... :(

Existen varias soluciones:

  • poner <globalization requestEncoding="iso-8859-1" responseEncoding="iso-8859-1"/> en su Web.config. Pero puede venir con otros problemas, y su aplicación ya no será estándar (no funcionará con idiomas como el japonés) ... ¡Y de todos modos, prefiero usar UTF-8!

  • ve a about: config en Firefox y establece el valor de network.standard-url.encode-query-utf8 en verdadero. Ahora funcionará para usted (Firefox codificará toda su url con utf-8). Pero no para nadie más ...

  • La peor solución que pude encontrar fue manejar esto con código. Si la decodificación predeterminada no funcionó, volveremos a analizar QueryString con iso8859-1:

    string query = Request.QueryString["search"];
    if (query.Contains("%ufffd"))
        query = HttpUtility.ParseQueryString(Request.Url.Query, Encoding.GetEncoding("iso-8859-1"))["search"];
    query = HttpUtility.UrlDecode(query);
    

Funciona con hipervínculos y URL ingresada manualmente, en francés, inglés o japonés. Pero no sé cómo manejará otras codificaciones como ISO8859-5 (ruso) ...

¿Alguien tiene una mejor solución?

Esto resuelve solo el problema de la URL ingresada manualmente. En sus hipervínculos, no olvide codificar los parámetros de url con HttpUtility.UrlEncode en el servidor o encodeURIComponent en el código javascript. Y use HttpUtility.UrlDecode para decodificarlo.

Otros consejos

    public string GetEncodedQueryString(string key)
    {
        string query = Request.QueryString[key];
        if (query != null)
            if (query.Contains((char)0xfffd))
                query = HttpUtility.ParseQueryString(Request.Url.Query, Encoding.GetEncoding("iso-8859-1"))[key];
        return query;
    }

creo que su problema está en la memoria flash, no en el .net. envía al personaje especial de una manera extraña. intente codificar urlen la cadena de búsqueda antes de enviarla al servidor.

Si la aplicación espera que la solicitud codificada en URL se base en UTF-8, el carácter " ø " debe ser " %C3%B8 " ;, no " %F8 " ;. Cualquiera sea la función que esté utilizando para escapar / codificar esa solicitud, probablemente deba pasarle el nombre de la codificación de caracteres subyacente, & Quot; UTF-8 & Quot ;.

Resulta que ActionScript 2.0 enviará el URL codificado / escapado con UTF-8 mientras que ActionScript 3.0 usó ISO-8859-1. La forma de resolver esto fue cambiar el valor de Request.Encoding dentro de Global.asax si se especifica una codificación en la URL:

void Application_BeginRequest(object sender, EventArgs e)
{
    HttpContext ctx = HttpContext.Current;

    // encoding specified?
    if (!String.IsNullOrEmpty(Request["encoding"]))
    {
        ctx.Request.ContentEncoding = System.Text.Encoding.GetEncoding(ctx.Request["encoding"]);
    }        
}

¿Podría hacerse de otra manera?

Saludos, nitech

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top