Frage

habe ich ein Problem, das ich weiß nicht, wie zu lösen.

Ich habe einen Indy10 HTTP-Server. Ich habe beide Indy9 und Indy10 HTTP-Server in vielen Anwendungen verwendet und hatte nie Probleme. Aber jetzt bin ich mit Indy10 HTTP-Server mit ExtJS Javascript RAI-Framework.

Das Problem ist, wenn ich Daten senden, die nicht-ansi-Zeichen enthält. Wenn ich zum Beispiel Buchstaben „C“ vorlegen, die ein Brief, in 1250-Codepage ist (Slowenisch, Kroatisch ...) erhalte ich die folgenden in Indy unter „unparsed params“ -> „% C4% 8D“. Das ist richtig hexadezimale Darstellung des „C“ Briefes in utf-8-Codierung. Alle meine Seiten sind utf-8, und ich hatte nie irgendwelche Probleme Formulardaten an Indy submiting. Ich gedebuggt den Code und sieht, dass ich tatsächlich eine Folge von Bytes wie diese: [37, 67, 52, 37, 56, 68]. Dies ist die Byte-Darstellung der Zeichenfolge „% C4% 8D“. Aber natürlich Indy kann dies nicht richtig-16 UTF kodieren. So als Beispiel. Das tatsächliche Formularfeld:

FirstName=črt

kommt wie folgt aus, wenn submited:

FirstName=%C4%8Drt

Ich weiß nicht, wie diese zu lösen. Ich schaute auf ExtJS-Foren, aber es gibt nichts zu diesem Thema. Kennt jemand etwas über diese Art von Problem?

Bearbeiten :

Wenn ich kodieren params ad JSON kommen sie richtig. Ich habe auch versucht zu URL dekodieren die params, aber das Ergebnis ist nicht korrekt. Vielleicht habe ich etwas verpasst. Ich werde wieder so aussehen. Und ja, es scheint, dass ExtJS URL die params codiert

EDIT2 :

Ok, ich habe mehr entdeckt. Ich verglich den tatsächlichen Inhalt der Post-Daten. Es ist wie folgt:

Delphi 2006 (Indy10): FirstName=%C4%8D
Delphi 2010 (Indy10): FirstName=%C4%8D

In beiden Fällen sind die unparsed params identisch. Ich habe ParseParams eingeschaltet und in BDS2006 sie sind korrekt analysiert, aber unter 2010 sind sie nicht. Dies ist Indy10 mit delphi gebauscht. Gibt es einen Fehler in dieser Version oder bin ich etwas falsch zu machen?

EDIT3 :

Ich habe die neuesten Nightly Build od Indy10. Immer noch das gleiche Problem.

Edit4 :

Ich bin gezwungen, meine eigene Antwort zu akzeptieren.

War es hilfreich?

Lösung

zu diesem Thema zu beantworten.

Dies funktioniert definitiv nicht, wie es unter Unicode sollte. Indy verwendet Unicode-Strings intern. Das Problem ist, wenn Parameter TStringList decodiert werden. Das Problem ist die Zeile:

Params.Add(TIdURI.URLDecode(s));

in den "TIdHTTPRequestInfo.DecodeAndSetParams" gefunden. Es ist nicht dekodieren params richtig, wahrscheinlich, weil es über Unicode-Strings arbeitet.

Die Abhilfe, die ich gefunden ist "HTTPDecode" von "HTTPApp.pas" zu verwenden.

Params := TStringList.Create;
try
  Params.StrictDelimiter := True;
  Params.Delimiter := '&';

  // parse the parameters and store them into temporary string list
  Params.DelimitedText := UTF8ToString(HTTPDecode(UTF8String(Request.UnparsedParams)));
  // do something with params... 
finally
  Params.Free;
end;

Aber ich kann nicht glauben, dass eine solche gemeinsame Aufgabe nicht richtig funktioniert. Kann jemand bestätigen das ist wirklich ein Bug oder bin ich etwas falsch nur tun?

Andere Tipps

Es erscheint die Zeichenfolge URL-kodiert, so dass Sie den folgenden Code zu dekodieren verwenden:

uses
  idURI;

value := TIdURI.URLDecode( value );

Bearbeiten

Es scheint, gibt es einen Fall, wo der Decoder nicht richtig das doppelte Bytes als ein einzelnes Zeichen dekodieren. Mit Blick auf die Quelle, es scheint, dass es richtig entschlüsseln würde, wenn das Zeichen wie% UC48D codiert, aber in meiner diese Prüfung ordnungsgemäß funktioniert immer noch nicht entschlüsseln. Interessant ist, dass die TidURI.ParamsEncode Funktion die richtige Codierung erzeugt, aber diese Codierung ist nicht umkehrbar die richtigen Routinen in der neuesten Version von Indy 10. mit

Ich bin mit Delphi 7 und wandern zu Indy 10. Ich fand wahrscheinlich Problem mit portugiesischen Zeichen und lösen diese Änderung der Quelle unter:

procedure TIdHTTPRequestInfo.DecodeAndSetParams(const AValue: String);
  ...
  //Params.Add(TIdURI.URLDecode(s)); //-- UTF8 supose
  Params.Add(TIdURI.URLDecode(s,TIdTextEncoding.Default)); //-- ASCII worked
  ...

Ende;

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top