2009-04-30 4 views
1

J'ai un projet Web C# .net qui ont une étiquette de mondialisation définie sur:Obtenir U + FFFD/65533 au lieu de caractère spécial de la chaîne de requête

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

Lorsque cette URL une application Flash (vous obtenez le même problème lorsque vous entrez l'URL manuellement dans un navigateur): c_product_search.aspx recherche = kjøkken (alternative:? c_product_search-ASPX recherche = 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 sais pas trop sur le codage de caractères, mais il semble que le ø a reçu un caractère de remplacement Unicode, non?

J'ai essayé de changer l'étiquette de la mondialisation:

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

qui a fait le travail à la demande. Cependant, maintenant, d'autres recherches sur ma page ont cessé de fonctionner.

J'ai aussi essayé ce qui suit 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

Répondre

3

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

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

Plusieurs solutions existent:

  • mis <globalization requestEncoding="iso-8859-1" responseEncoding="iso-8859-1"/> dans votre web.config.Mais vous pouvez le faire avec d'autres problèmes, et votre application ne sera plus standard (ça ne fonctionnera pas avec des langages comme le japonais) ... Et de toute façon, je préfère utiliser UTF-8!

  • allez à environ: config dans Firefox et définissez la valeur network.standard-url.encode-query-utf8 sur true. Il fonctionnera maintenant pour vous (Firefox encodera toute votre URL avec utf-8). Mais pour personne d'autre ...

  • La solution la moins mauvaise que je pouvais trouver était de gérer cela avec du code. Si le décodage par défaut n'a pas fonctionné, nous Reparse 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); 
    

Il fonctionne avec des hyperliens et des URL saisies manuellement, en français, anglais ou japonais. Mais je ne sais pas comment il va gérer d'autres encodages comme ISO8859-5 (russe) ...

Quelqu'un at-il une meilleure solution?

Ceci résout seulement le problème de l'URL entrée manuellement. Dans vos liens hypertexte, n'oubliez pas d'encoder les paramètres url avec HttpUtility.UrlEncode sur le serveur, ou encoderURIComponent sur le code javascript. Et utilisez HttpUtility.UrlDecode pour le décoder.

+0

Merci. Si vous regardez en bas, cette solution a fonctionné pour moi. Je n'ai pas pu changer l'encodage dans le code cs. Je devais le faire avant que la session ne soit lancée - à l'intérieur de global.asax. Mais peut-être que votre solution fonctionne parce qu'elle n'essaie pas de changer le codage du HTTPContext. – nitech

+0

Juste pour clore cette question. Le mien et ceci et probablement d'autres réponses sur cette page vous aideront. Cela fait un an que j'ai fait un codage AS, donc je n'ai jamais pu tester ça correctement. – nitech

+0

La dernière suggestion a fonctionné brillamment. Merci. – Karlth

0

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.

+0

Bien. En flash il y a une fonction appelée escape. J'ai essayé cela et cela ne fait aucune différence. En outre, je reçois le même problème si j'écris simplement l'URL dans le champ d'adresse manuellement. – nitech

+0

ce que nous faisons sur notre site, c'est que nous avons, en fonction de la langue des clients, l'encodage ISO dédié dans la demande et la réponse. parce que beaucoup de clients ne comprennent pas UTF-16. ce serait aussi une possibilité. – cRichter

0

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

+0

Vous êtes sur quelque chose là-bas. Il semble qu'il y ait une variation sur le codage d'URL entre AS2 et AS3. J'ai fait un échantillon sur AS2 qui fonctionne bien, mais apparemment le même échantillon encode différemment sur AS3. Cet article en dit plus à ce sujet. Il ne fournit cependant pas de solution. http://www.ultrashock.com/forums/actionscript/as3-escape-vs-as2-escape-122046.html – nitech

+0

Et aussi, cela n'a pas de sens que je décode ø en U + fffd si le forum ultrashock est correct quand il est dit AS3 encoder avec ISO-8859-1. – nitech

+0

Si votre backend .NET s'attend à ce que le formulaire codé en URL soit basé sur UTF-8, il verra% F8 comme une erreur et le remplacera par le caractère de remplacement standard, U + FFFD. Que se passe-t-il si vous entrez manuellement la chaîne son formulaire UTF-8, "kj% C3% B8kken"? –

0

Il s'avère que ActionScript 2.0 envoie l'URL encodée/échappée avec UTF-8 tandis qu'ActionScript 3.0 utilise ISO-8859-1. La façon de résoudre c'était de changer la valeur de l'intérieur Request.Encoding 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"]); 
    }   
} 

Pourrait-il être fait différemment?

Cordialement, NITECH

1
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; 
    } 
+0

Intéressant. Le projet est si vieux maintenant que je n'ai aucune chance de le tester. Peut-être que quelqu'un d'autre a essayé cela et a trouvé une solution de travail? – nitech

Questions connexes