Question

J'ai un projet Web C # .net qui a une balise de globalisation définie à:

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

Lorsque cette adresse URL est une application Flash (vous rencontrez le même problème lorsque vous entrez l'adresse URL manuellement dans un navigateur): c_product_search.aspx? search = kj & # 248; kken (ou alternativement: c_product_search-aspx? search # kj % F8kken

Les deux renvoient les codes de caractères suivants:

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

Je ne connais pas beaucoup le codage de caractères, mais il semble que le & # 248; a été donné un caractère de remplacement Unicode, non?

J'ai essayé de remplacer la balise de globalisation par:

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

Cela a permis à la demande de fonctionner. Cependant, maintenant, d'autres recherches sur ma page ont cessé de fonctionner.

J'ai également essayé les solutions suivantes avec des résultats similaires:

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

Que dois-je faire?

Cordialement,

nitech

Était-ce utile?

La solution

Le problème vient de la combinaison Firefox / Asp.Net. Lorsque vous entrez manuellement une URL dans la barre d'adresse de Firefox, si l'URL contient des caractères français ou suédois, Firefox l'encodera avec & Quot; ISO-8859-1 & Quot; par défaut.

Mais quand asp.net reçoit une telle URL, il pense que c'est encodé en utf-8 ... Et les caractères encodés deviennent & "U + fffd &"; Je ne pouvais pas trouver un moyen dans asp.net de détecter que l'URL est & "ISO-8859-1 &"; Request.Encoding est défini sur utf-8 ...: (

Plusieurs solutions existent:

  • mettez <globalization requestEncoding="iso-8859-1" responseEncoding="iso-8859-1"/> dans votre Web.config. Mais vous pouvez rencontrer d’autres problèmes et votre application ne sera plus standard (elle ne fonctionnera pas avec des langues telles que le japonais) ... Et de toute façon, je préfère utiliser UTF-8!

  • allez dans about: config dans Firefox et définissez la valeur de network.standard-url.encode-query-utf8 sur true. Cela fonctionnera maintenant pour vous (Firefox encodera toute votre URL avec utf-8). Mais pas pour quelqu'un d'autre ...

  • La moins mauvaise solution que je pouvais avoir était de gérer cela avec du code. Si le décodage par défaut ne fonctionne pas, nous analysons à nouveau QueryString avec 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);
    

Cela fonctionne avec les hyperliens et les URL saisies manuellement, en français, anglais ou japonais. Mais je ne sais pas comment il gérera d’autres encodages comme ISO8859-5 (russe) ...

Quelqu'un at-il une meilleure solution?

Ceci résout uniquement le problème des URL saisies manuellement. Dans vos hyperliens, n'oubliez pas de coder les paramètres d'URL avec HttpUtility.UrlEncode sur le serveur ou encodeURIComponent sur le code javascript. Et utilisez HttpUtility.UrlDecode pour le décoder.

Autres conseils

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

Je pense que votre problème est dans le flash, pas le. Net. il envoie le caractère spécial d'une manière étrange. essayez d’urlencoder la chaîne de recherche avant de l’envoyer au serveur.

Si l'application s'attend à ce que la demande codée en URL soit basée sur UTF-8, le caractère " ø " devrait être & "; %C3%B8 &"; pas & "; %F8 &". Quelle que soit la fonction utilisée pour échapper / encoder cette requête, vous devrez probablement lui donner le nom du codage de caractères sous-jacent, & "; UTF-8 &";.

.

Il s'avère qu'ActionScript 2.0 envoie l'URL encodée / échappée avec UTF-8 alors qu'ActionScript 3.0 utilisait ISO-8859-1. La solution à ce problème consiste à modifier la valeur Request.Encoding dans Global.asax si un codage est spécifié dans l'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"]);
    }        
}

Cela pourrait-il être fait différemment?

Cordialement, nitech

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top