Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi XE2/Indy 10: Umlaute bei TidHTTP werden als ? angezeigt (https://www.delphipraxis.net/168879-delphi-xe2-indy-10-umlaute-bei-tidhttp-werden-als-angezeigt.html)

kretabiker 15. Jun 2012 15:42

Delphi XE2/Indy 10: Umlaute bei TidHTTP werden als ? angezeigt
 
Hallo,

ich frage per Indy-Komponente TidHTTP per Post Daten ab, die mir als XML-String zurück gegeben werden. Dabei gehe ich gemäß dem Tutorial http://www.delphipraxis.net/160152-i...protokoll.html vor.

Der Charset ist dabei ISO-8859-1, was ich auch im Source explizit setze:

Delphi-Quellcode:
(...)
  HTTPClient.Request.CharSet := 'ISO-8859-1';
 
  Enc := CharsetToEncoding(HTTPClient.Request.CharSet);

  ResponseStr := HTTPClient.Post(RequestUrl, Params, Enc);

(...)
Im ResponseStr steht z.B. statt München jedoch M?nchen, obwohl "über den Draht" vom Server der Hexwert fc, der bei ISO-8859-1 dem ü entspricht, geliefert wird - siehe Auszug aus einem WireShark-Netzwerkprotokollmitschnitt:

0000 61 68 6e 3d 22 4d fc 6e 63 68 65 6e 20 28 44 45 ahn="M.nchen (DE

Gleiches auch bei ö und ä. Ich tappse da jetzt völlig im Dunkeln, wie ich das Fragezeichen wegbekomme. Charsets habe ich schon eine ganze Reihe durch, ASCII, Ansi, diverse ISO-8859-Derivate usw.

Hat jemand sonst noch eine Idee?

Viele Grüße

Udo "Kretabiker" Treichel

geskill 15. Jun 2012 17:15

AW: Delphi XE2/Indy 10: Umlaute bei TidHTTP werden als ? angezeigt
 
Also die Antwort vom Server wird nicht korrekt umgewandelt.

Du könntest schauen ob du AcceptCharSet gesetzt hast.

Es könnte auch sein, dass der Server ein falsches CharSet (Response.CharSet) sendet und dies somit von Indy falsch umgewandelt wird. Dann müsstest du dies manuell korrigieren. Oder wenn du Zugriff zum Server hast schauen ob dies korrigieren kannst.
Delphi-Quellcode:
ReplyData := TMemoryStream.Create;

HTTPClient.Request.CharSet := 'ISO-8859-1';
   
Enc := CharsetToEncoding(HTTPClient.Request.CharSet);

HTTPClient.Post(RequestUrl, Params, ReplyData, Enc);

ReplyData.Position := 0;

// statt Response.Charset kannst du dies jetzt beliebig anpassen
ResponseStr := ReadStringAsCharset(ReplyData, Response.Charset);

// mit ReplyData.DataString kommt du an den Quellcode

Benutzt du die Version die mit XE2 installiert wurde oder eine aktuellere aus dem SVN. Also empfehle dir auf eine aktuelle aus dem SVN umzusteigen.

kretabiker 28. Jun 2012 16:47

AW: Delphi XE2/Indy 10: Umlaute bei TidHTTP werden als ? angezeigt
 
Hallo Sebastian,

sorry, hat eine Weile gedauert, bis ich mich wieder mit diesem Thema befassen konnte...

Ich bin deinem Vorschlag gefolgt und setzte die Requests nun so ab wie von dir skizziert, um dann das Ergebnis aus dem MemoryStream mit ReadStringAsCharSet auszulesen - die Kodierung setze ich in diesem Fall manuell auf ISO-8859-1 -, und siehe da: das sind sie wieder, meine schmerzlich vermissten Umlaute... :-D Hat also funktioniert und ich habe wieder was gelernt!

Danke dir für diesen wertvollen Tipp!

Die Indyversion ist die von XE2 mitgelieferte. Eventuell ganz vielleicht werde ich eine neuere Version aus dem SVN ziehen, wie du empfiehlst. Allerdings fühle ich mich nicht so ganz wohl dabei, da hier auch noch RemObjects-Komponenten zum Einsatz kommen, da weiß ich nicht, was passiert, wenn ich eine andere Indy-Version einspiele. Es scheint aber etwas damit zu tun zu haben, denn in einem anderen Projekt unter D2007, das die gleiche Routine nutzt, trat das Problem bisher nicht auf.

Danke dir für deine Hilfe

Udo "Kretabiker" Treichel


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz