Domanda

Ho un progetto web C # .net che ha un tag di globalizzazione impostato su:

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

Quando questo URL è un'applicazione Flash (si ottiene lo stesso problema quando si immette l'URL manualmente in un browser): c_product_search.aspx? search = kj & # 248; kken (in alternativa: c_product_search-aspx? search = kj % F8kken

Entrambi restituiscono i seguenti codici carattere:

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

Non so molto sulla codifica dei caratteri, ma sembra che & # 248; è stato dato un carattere di sostituzione Unicode, giusto?

Ho provato a cambiare il tag di globalizzazione in:

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

Che ha fatto funzionare la richiesta. Tuttavia, ora, altre ricerche sulla mia pagina hanno smesso di funzionare.

Ho anche provato quanto segue con risultati simili:

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

Cosa devo fare?

Cordiali saluti,

Nitech

È stato utile?

Soluzione

Il problema deriva dalla combinazione Firefox / Asp.Net. Quando hai inserito manualmente un URL nella barra degli indirizzi di Firefox, se l'URL contiene caratteri francesi o svedesi, Firefox codificherà l'URL con & Quot; ISO-8859-1 & Quot; per impostazione predefinita.

Ma quando asp.net riceve un tale url, pensa che sia codificato utf-8 ... E i caratteri codificati diventano " U + fffd " ;. Non sono riuscito a trovare un modo in asp.net per rilevare che l'URL è & Quot; ISO-8859-1 & Quot ;. Request.Encoding è impostato su utf-8 ... :(

Esistono diverse soluzioni:

  • inserisci <globalization requestEncoding="iso-8859-1" responseEncoding="iso-8859-1"/> nel tuo Web.config. Ma potresti incontrare altri problemi e la tua applicazione non sarà più standard (non funzionerà con lingue come il giapponese) ... E comunque, preferisco usare UTF-8!

  • vai a about: config in Firefox e imposta il valore di network.standard-url.encode-query-utf8 su true. Ora funzionerà per te (Firefox codificherà tutto il tuo URL con utf-8). Ma non per nessun altro ...

  • La soluzione peggiore che potessi trovare era gestirla con il codice. Se la decodifica predefinita non ha funzionato, analizziamo 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);
    

Funziona con collegamenti ipertestuali e URL inserito manualmente, in francese, inglese o giapponese. Ma non so come gestirà altre codifiche come ISO8859-5 (russo) ...

Qualcuno ha una soluzione migliore?

Questo risolve solo il problema dell'URL inserito manualmente. Nei tuoi collegamenti ipertestuali, non dimenticare di codificare i parametri url con HttpUtility.UrlEncode sul server o codificareURIComponent sul codice javascript. E usa HttpUtility.UrlDecode per decodificarlo.

Altri suggerimenti

    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;
    }

Penso che il tuo problema sia nel flash, non nel .net. invia il personaggio speciale in un modo strano. prova a urlencode la stringa di ricerca bevore che la mandi al server.

Se l'app prevede che la richiesta con codifica URL sia basata su UTF-8, il carattere " ø " dovrebbe essere " %C3%B8 " ;, non " %F8 " ;. Qualunque funzione tu stia usando per scappare / codificare quella richiesta, probabilmente dovrai passare il nome della codifica del carattere sottostante, & Quot; UTF-8 & Quot ;.

Si scopre che ActionScript 2.0 invierà l'URL codificato / con escape con UTF-8 mentre ActionScript 3.0 utilizzava ISO-8859-1. Il modo per risolverlo era cambiare il valore Request.Encoding all'interno di Global.asax se nell'URL è stata specificata una codifica:

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"]);
    }        
}

Potrebbe essere fatto diversamente?

Saluti, Nitech

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top