2009-04-30 6 views
1

ich ein C# .net Web-Projekt, das eine Globalisierung Tag hat auf:Erste U + FFFD/65533 anstelle von Sonderzeichen aus Query String

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

Wenn diese URL eine Flash-Anwendung (Sie das gleiche bekommen Problem, wenn Sie geben die URL manuell in einem Browser): c_product_search.aspx suchen = kjøkken (alternativ:? c_product_search-aspx search = kj% F8kken

die beiden folgenden Zeichencodes zurück:

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 

Ich weiß nicht viel über die Zeichencodierung, aber es scheint, dass der ø ein Unicode-Ersatzzeichen erhalten hat, oder?

Ich versuchte, die Globalisierung Tag zu ändern:

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

, dass die Anfrage Arbeit gemacht. Jetzt jedoch funktionieren andere Suchvorgänge auf meiner Seite nicht mehr.

Ich habe versucht, auch die folgenden mit ähnlichen Ergebnissen:

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

Was soll ich tun?

Mit freundlichen Grüßen,

Nitech

Antwort

3

Das Problem aus der Kombination kommt Firefox/Asp.Net. Wenn Sie eine URL in der Adressleiste von Firefox manuell eingegeben haben und die URL französische oder schwedische Zeichen enthält, codiert Firefox standardmäßig die URL mit "ISO-8859-1".

Aber wenn asp.net eine solche URL erhält, denkt es, dass es utf-8 kodiert ist ... Und codierte Zeichen werden "U + fffd". Ich konnte keinen Weg in asp.net finden, um festzustellen, dass die URL "ISO-8859-1" ist. Request.Encoding wird auf utf-8 ... :(

Es gibt mehrere Lösungen:

  • <globalization requestEncoding="iso-8859-1" responseEncoding="iso-8859-1"/> in Web.config setzen.Aber du magst es mit anderen Problemen, und deine Anwendung wird nicht mehr Standard sein (es wird nicht mit Sprachen wie Japanisch funktionieren) ... Und trotzdem bevorzuge ich UTF-8!

  • Gehe zu über: Config in Firefox und setze den Wert network.standard-url.encode-query-utf8 auf True. Es wird jetzt für Sie arbeiten (Firefox wird Ihre gesamte URL mit utf-8 kodieren). Aber nicht für irgendjemand anderen ...

  • Die am wenigsten schlechteste Lösung, mit der ich kommen konnte, war, dies mit Code zu handhaben. Wenn die Standard-Decodierung nicht funktioniert, wir reparse Abfragezeichenfolgen mit 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); 
    

Es arbeitet mit Hyperlinks und manuell eingegebenen URL, in Französisch, Englisch oder Japanisch. Aber ich weiß nicht, wie es andere Kodierungen wie ISO8859-5 (Russisch) handhaben wird ...

Hat jemand eine bessere Lösung?

Dies löst nur das Problem der manuell eingegebenen URL. Vergessen Sie in Ihren Hyperlinks nicht, URL-Parameter mit HttpUtility.UrlEncode auf dem Server oder encodeURIComponent für den JavaScript-Code zu kodieren. Und benutze HttpUtility.UrlDecode, um es zu dekodieren.

+0

Danke. Wenn Sie auf den Boden schauen - diese Lösung hat für mich funktioniert. Ich konnte die Codierung im cs-Code nicht ändern. Ich musste es tun, bevor die Sitzung begonnen wurde - in global.asax. Aber vielleicht funktioniert Ihre Lösung, weil sie nicht versucht, die Kodierung des HTTPContext zu ändern. – nitech

+0

Nur um diese Frage zu schließen. Sowohl meine als auch diese und wahrscheinlich andere Antworten auf dieser Seite werden Ihnen weiterhelfen. Es ist ein Jahr her, seit ich AS-Codierung gemacht habe, also habe ich das nie richtig testen können. – nitech

+0

Der letzte Vorschlag hat hervorragend funktioniert. Vielen Dank. – Karlth

0

Ich denke, Ihr Problem im Flash ist, nicht die .net. es sendet die Sonderzeichen auf eine seltsame Art und Weise. versuchen Sie, die Suchzeichenfolge zu codieren, bevor Sie sie an den Server senden.

+0

Gut. Im Flash gibt es eine Funktion namens Escape. Ich habe das versucht und es macht keinen Unterschied. Auch bekomme ich das gleiche Problem, wenn ich einfach die URL in das Adressfeld manuell schreiben. – nitech

+0

was wir auf unserer Website machen, ist, dass wir je nach der Sprache des Kunden die dedizierte ISO-Kodierung in Anfrage und Antwort haben. weil viele der Clients UTF-16 nicht verstehen. das wäre auch eine möglichkeit. – cRichter

0

Wenn die App der URL-codierte Anforderung erwartet die Zeichen werden basierend auf UTF-8 „ø“ sollten „%C3%B8“, nicht „%F8“ sein. Welche Funktion Sie auch verwenden, um diese Anforderung zu umgehen/zu verschlüsseln, müssen Sie wahrscheinlich den Namen der zugrunde liegenden Zeichencodierung "UTF-8" übergeben.

+0

Sie sind auf etwas dort. Es scheint eine Variation der URL-Codierung zwischen AS2 und AS3 zu geben. Ich habe eine Probe auf AS2 gemacht, die gut funktioniert, aber anscheinend kodiert die gleiche Probe auf AS3 anders. Dieser Beitrag erzählt mehr darüber. Es bietet jedoch keine Lösung. http://www.ultrashock.com/forums/actionscript/as3-escape-vs-as2-escape-122046.html – nitech

+0

Und auch, es macht keinen Sinn, dass ich if zu U + fffd dekodiere, wenn das Ultrashock-Forum ist korrekt, wenn AS3 mit ISO-8859-1 kodiert wird. – nitech

+0

Wenn Ihr .NET-Back-End erwartet, dass das URL-codierte Formular auf UTF-8 basiert, wird% F8 als Fehler angezeigt und durch das Standard-Ersatzzeichen U + FFFD ersetzt. Was passiert, wenn Sie die Zeichenkette ihre UTF-8-Form "kj% C3% B8kken" manuell eingeben? –

0

Es stellt sich heraus, dass ActionScript 2.0 die URL codiert/maskiert mit UTF-8 sendet, während ActionScript 3.0 ISO-8859-1 verwendet. Die Art und Weise, diese zu lösen war der Request.Encoding Wert innerhalb Global.asax zu ändern, wenn eine Kodierung in der URL angegeben wird:

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

Könnte es anders gemacht werden?

Grüße, 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

Interessant. Das Projekt ist so alt, dass ich momentan keine Chance habe, es zu testen. Vielleicht hat jemand anderes das ausprobiert und eine funktionierende Lösung gefunden? – nitech