2009-06-18 6 views
2

wir eine Seite haben, die Beiträge Daten an unsere ASP.NET-Anwendung in ISO-8859-1ISO-8859-1 zu UTF8 in ASP.NET 2

<head> 
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"> 
    <title>`Sample Search Invoker`</title> 
</head> 
<body> 

<form name="advancedform" method="post" action="SearchResults.aspx"> 
    <input class="field" name="SearchTextBox" type="text" /> 
    <input class="button" name="search" type="submit" value="Search &gt;" /> 
</form> 

und in der Code-behind (Search aspx.cs)

System.Collections.Specialized.NameValueCollection postedValues = Request.Form; 
String nextKey; 
for (int i = 0; i < postedValues.AllKeys.Length; i++) 
{ 
    nextKey = postedValues.AllKeys[i]; 

    if (nextKey.Substring(0, 2) != "__") 
    { 
     // Get basic search text 
     if (nextKey.EndsWith(XAEConstants.CONTROL_SearchTextBox)) 
     { 
      // Get search text value 
      String sSentSearchText = postedValues[i]; 

      System.Text.Encoding iso88591 = System.Text.Encoding.GetEncoding("iso-8859-1"); 
      System.Text.Encoding utf8 = System.Text.Encoding.UTF8; 

      byte[] abInput = iso88591.GetBytes(sSentSearchText); 

      sSentSearchText = utf8.GetString(System.Text.Encoding.Convert(iso88591, utf8, abInput)); 

      this.SearchText = sSentSearchText.Replace('<', ' ').Replace('>',' '); 
      this.PreviousSearchText.Value = this.SearchText; 
     } 
    } 
} 

Wenn wir durch Merkblätter übergeben wird sie aus postedValues ​​gezogen [i] als Merkbltter Die rohe string ist Merkbl% ufffdtter

Irgendwelche Ideen?

+0

Werfen Sie einen Blick auf meine angepasste Antwort – AnthonyWJones

Antwort

7

Sie haben diese Codezeile: -

String sSentSearchText = postedValues[i]; 

Die Decodierung von Oktetts in der Post hat hier geschehen.

Das Problem ist, dass META http-equiv den Server nicht über die Codierung informiert.

Sie könnten einfach RequestEncoding = "ISO-8859-1" zur @Page-Direktive hinzufügen und aufhören zu versuchen, mit der Decodierung herumzuhantieren (da es schon passiert ist).

Das hilft auch nicht. Anscheinend können Sie die Request-Codierung nur in der Datei web.config angeben.

Besser wäre es, die Verwendung von ISO-8859-1 insgesamt zu beenden und es mit der Standard-UTF-8-Codierung zu belassen. Ich kann keinen Gewinn und nur Schmerz sehen, wenn ich eine restriktive Kodierung verwende.

bearbeiten

Wenn es scheint, dass die Entsendung Formen Codierung ändert nicht die Möglichkeit besteht, dann scheinen wir keine andere Wahl gelassen zu werden, als die Decodierung selbst zu behandeln.Zu diesem Zweck sind die beiden statischen Methoden in Ihrem Empfangs Code-Behind: -

private static NameValueCollection GetEncodedForm(System.IO.Stream stream, Encoding encoding) 
{ 
    System.IO.StreamReader reader = new System.IO.StreamReader(stream, Encoding.ASCII); 
    return GetEncodedForm(reader.ReadToEnd(), encoding); 
} 


private static NameValueCollection GetEncodedForm(string urlEncoded, Encoding encoding) 
{ 
    NameValueCollection form = new NameValueCollection(); 
    string[] pairs = urlEncoded.Split("&".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); 

    foreach (string pair in pairs) 
    { 
     string[] pairItems = pair.Split("=".ToCharArray(), 2, StringSplitOptions.RemoveEmptyEntries); 
     string name = HttpUtility.UrlDecode(pairItems[0], encoding); 
     string value = (pairItems.Length > 1) ? HttpUtility.UrlDecode(pairItems[1], encoding) : null; 
     form.Add(name, value); 
    } 
    return form; 
} 

Anstatt nun die Zuordnung: -

postedValues = Request.Form; 

Verwendung: -

postValues = GetEncodedForm(Request.InputStream, Encoding.GetEncoding("ISO-8859-1")); 

können Sie jetzt entfernen die Kodierung Marlarky aus dem Rest des Codes.

+0

Einstellung der Eingabeseite zu UTF-8 wäre meine ideale Option; Das Formular ist jedoch in eine Kundenseite eingebettet und scheint die Codierung nicht in UTF-8 ändern zu wollen. Daher untersuche ich Alternativen. Warum ist eine solche ballache kodieren, würde ich glücklich jagen und haben strenge Worte mit den Menschen, die mit diesem Chaos kam, wenn ich die Ressourcen hatte :-) –

+0

Encoding ist kein Problem in ASP.NET ist sehr einfach . __Lassen Sie die Codierung allein, berühren Sie sie nicht, das Standard-UTF-8 funktioniert gut__. – AnthonyWJones

+0

in einer idealen Welt würde ich UTF-8 verwenden, aber leider ist es nicht so einfach in dieser App .... –

2

Ich denke du deine Codierung in web.config wie das wird wahrscheinlich Ihr Problem lösen:

<configuration> 
    <system.web> 
     <globalization 
      fileEncoding="iso-8859-1" 
      requestEncoding="iso-8859-1" 
      responseEncoding="iso-8859-1" 
      culture="en-US" 
      uiCulture="en-US" 
     /> 
    </system.web> 
</configuration> 
+0

yeh, das ist eine Option, die ich in Betracht gezogen hatte, aber es gibt andere Probleme mit dem, leider ... –

0

Das ist, weil Sie die Zeichenfolge als ISO-8859-1 codieren und Decodierung, als ob es sich um eine Zeichenfolge war codiert als UTF-8. Dies wird sicherlich die Daten durcheinander bringen.

Das Formular sendet die Daten nicht als ISO-8859-1, nur weil Sie die Seite mit dieser Codierung senden. Sie haben keine Codierung für die Formulardaten angegeben. Daher wählt der Browser eine Codierung aus, die die Daten im Formular verarbeiten kann. Es kann ISO-8859-1 wählen, aber es kann auch eine andere Kodierung wählen.

Die Daten werden an den Server gesendet, wo sie dekodiert und in die Request.Form-Sammlung eingefügt werden, entsprechend der vom Browser angegebenen Codierung.

Alles was Sie tun müssen, ist die Zeichenfolge zu lesen, die bereits aus der Request.Form-Sammlung entschlüsselt wurde. Sie müssen auch nicht alle Elemente in der Sammlung durchlaufen, da Sie den Namen des Textfelds bereits kennen.

Just do:

string sentSearchText = Request.Form("SearchTextBox"); 
+0

"Das Formular gibt die Daten nicht als ISO-8859-1 überhaupt . " Ich glaube nicht, dass dies der Fall ist. Browser verwenden den Content-Type-Header des empfangenen HTML, um zu bestimmen, welche Codierung verwendet wird, um den Inhalt eines Formulars zu posten. – AnthonyWJones

+0

Hmm, wie poste ich das Formular als ISO-8859-1? Vielen Dank für den Kommentar auf dem Request.Form Zeug, das ist vererbten Code und es funktionierte, so dass ich nie in die Korrektur ging .. –

+0

Verwenden Sie accept-charset = "ISO-8859-1" im Formular-Tag, um die Codierung anzugeben . – Guffa

0

Was war ich am Ende tun unsere App zwingen in ISO-8859-1 zu sein. Unglücklicherweise können die zugrunde liegenden Daten Zeichen enthalten, die nicht gut in diese Codepage passen, also gehen wir die Daten durch, bevor sie angezeigt werden und konvertieren alles über den Zeichencode von 127 in eine Entität. Nicht ideal, aber arbeitet für uns ...

0

ich hatte das gleiche Problem, wie diese gelöst:

System.Text.Encoding iso_8859_2 = System.Text.Encoding.GetEncoding("ISO-8859-2"); 
    System.Text.Encoding utf_8 = System.Text.Encoding.UTF8; 

    NameValueCollection n = HttpUtility.ParseQueryString("RT=A+v%E1s%E1rl%F3+nem+enged%E9lyezte+a+tranzakci%F3t", iso_8859_2); 
    Response.Write(n["RT"]); 

A + v% E1s% E1rl% F3 + nem + enged% E9lyezte + a + tranzakci% F3t wird "A vásárló nem engedélyezte a tranzakciót" wie erwartet zurückgeben.

1
Function urlDecode(input) 
inp = Replace(input,"/","%2F") 
set conn = Server.CreateObject("MSXML2.ServerXMLHTTP") 
conn.setOption(2) = SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS 
conn.open "GET", "http://www.neoturk.net/urldecode.asp?url=" & inp, False 
conn.send "" 
urlDecode = conn.ResponseText 
End Function 

Um dies zu beschleunigen, nur eine Tabelle für decodiert und codiert Urls auf Ihrem db erstellen und auf global.asa application.on_start Abschnitt lesen. Später legte man sie auf das Anwendungsobjekt. Dann legen Sie eine Prüfprozedur für diese Anwendung obj. in der obigen Funktion und IF decodierte URL existiert nicht auf app-Array, DANN fordern Sie es einmal von Remote-Seite (Tipp: urldecode.asp sollte auf anderen Server sein siehe: http://support.microsoft.com/default.aspx?scid=kb;en-us;Q316451) und fügen Sie es in Ihre db und append an Anwendung Array-Objekt, ELSE Rückgabe der Funktion aus dem Anwendungsobjekt

Dies ist die beste Methode, die ich je gefunden habe. Wenn jemand weitere Informationen zu Anwendungsobjekt will, Datenbankoperationen usw. kontaktieren Sie mich [email protected] über

Sie oben Methode sehen kann erfolgreich arbeiten bei: lastiktestleri.com/Home

ich auch verwendet, HeliconTech des ISAPI_Rewrite Lite-Version Nutzung ist einfach: url = Request.ServerVariables ("HTTP_X_REWRITE_URL") dies die genaue uRL zurückkehren gerichtet /404.asp

2

Wir hatten das gleiche Problem, das Sie haben. Das Thema ist überhaupt nicht geradlinig.

Der erste Tipp ist, die Response Codierung der Seite, die die Daten (in der Regel die gleiche Seite wie die, die die Daten in .NET empfängt) auf die gewünschte Form Post-Codierung.

Dies ist jedoch nur ein Hinweis an den Browser des Benutzers, wie die Zeichen vom Server gesendet zu interpretieren. Der Benutzer könnte die Verschlüsselung manuell überschreiben. Und wenn der Benutzer die Kodierung der Seite außer Kraft setzt, wird auch die Kodierung der Daten, die in dem Formular gesendet werden, geändert (zu dem, für den der Benutzer die Kodierung eingestellt hat).

Es gibt jedoch einen kleinen Trick. Wenn Sie ein verstecktes Feld mit dem _charset_ (beachten Sie die Unterstrichen) Namen in dem Formular werden die meisten Browser dieses Formular Feld verwendet, um mit dem Namen des charset ausfüllen, wenn Sie das Formular veröffentlichen. Dieses Formularfeld ist auch ein Teil der HTML5-Spezifikation.

Sie könnten also denken, dass es Ihnen gut geht, wenn ASP.NET in Ihrer Seite bereits alle in das Formular gesendeten Parameter urldecodiert hat. Wenn Sie also den Wert im Feld _charset_ haben, wird der Wert des Feldes, das Merkblätter enthält, bereits von .NET falsch dekodiert.

Sie haben zwei Möglichkeiten:

  1. In der ASP.NET-Seite in Frage,
  2. In Application_BeginRequest, in Global.asax manuell das Parsen der Anfrage-String ausführen, analysieren die Anforderungsparameter manuell, Extrahieren das Feld _charset_. Wenn Sie den Wert erhalten, setzen Sie Request.ContentEncoding auf System.Text.Encoding.GetEncoding(<value of _charset_ field>). Wenn Sie dies tun, können Sie den Wert des Feldes enthält Merkblätter wie gewohnt lesen, egal, was die Client-charset in den Wert sendet.

In jedem der beiden oben genannten Fällen müssen Sie Request.InputStream manuell gelesen , um die Formulardaten zu holen. Ich würde empfehlen, die Response Encoding auf UTF-8 zu setzen, um die größtmögliche Anzahl von Optionen zu haben, in denen Zeichen akzeptiert werden, und dann die Sonderfälle zu behandeln, wenn der Benutzer den Zeichensatz, wie oben beschrieben, überschrieben hat.

+0

Warum behandelt ASP.NET das Feld _charset_ nicht automatisch und lässt uns nicht den Application_BeginRequest-Code schreiben? Hier ist ein Link für [_charset_] (http://www.w3.org/TR/html5/forms.html#application/x-www-form-urlencoded-encoding-algorithmus). –