Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Unicode-Daten richtig empfangen??? (https://www.delphipraxis.net/148053-unicode-daten-richtig-empfangen.html)

romber 21. Feb 2010 14:11


Unicode-Daten richtig empfangen???
 
Hallo!

Ich sende mit IdHTTP Anfragen an einen Webservice an und erhalte die Daten, die auch Unicode-Zeichen enthalten. Diese Zeichen gehen verloren und werden durch Fragezeichen ersetzt. Wie empfange ich die Unicode-Daten richtig?

Delphi-Quellcode:
ResponseStream := TStringStream.create;
RequestStream := TStringStream.Create;
RequestStream.WriteString(SERVICE_REQUEST_XML);
try
  http.Post(WEB_SERVICE_URL, RequestStream, ResponseStream);
except
...
end;

mjustin 21. Feb 2010 14:15

Re: Unicode-Daten richtig empfangen???
 
Ist es die aktuelle Indy Version (10.5.7)?

romber 21. Feb 2010 14:18

Re: Unicode-Daten richtig empfangen???
 
Ganz aktuell ist die Version nicht. Es ist aber nicht die fehlerhafte Indy-Version, die mit Delphi 2009 ausgeliefert wurde.

Luckie 21. Feb 2010 15:07

Re: Unicode-Daten richtig empfangen???
 
Unterstützt die Version, die du benutzt denn schon Unicode?

mjustin 21. Feb 2010 15:11

Re: Unicode-Daten richtig empfangen???
 
Wie sieht die Response aus, steht dort ein Encoding, das auch zu den Daten passt?

Mit http://donsproxy.moneybender.com/ kann man das recht einfach aufzeichnen

romber 21. Feb 2010 15:29

Re: Unicode-Daten richtig empfangen???
 
Zitat:

Zitat von Luckie
Unterstützt die Version, die du benutzt denn schon Unicode?

Ja, denke ich schon. Als ich Delphi 2009 installiert habe, ging nichts mit Unicode. Dann habe ich hier im Forum gelesen, dass ein Indy-Update her muss. Nach dem Update ging's.

Zitat:

Zitat von mjustin
Wie sieht die Response aus, steht dort ein Encoding, das auch zu den Daten passt?

Bei Response handelt es sich um XML-Daten. XML-Header enthält keine Encoding-Attribute.

romber 21. Feb 2010 16:21

Re: Unicode-Daten richtig empfangen???
 
Ich habe gerade die neuste Indy-Version installiert, leider ist das Problem immer noch da.

mjustin 21. Feb 2010 16:53

Re: Unicode-Daten richtig empfangen???
 
Die HTTP Header sind in Ordnung? (Z.B. Content-Type)?

IdHTTP explizit auf HTTP 1.1 umstellen (siehe Hinweis in IdHTTP.pas) würde ich noch versuchen.

mjustin 21. Feb 2010 16:59

Re: Unicode-Daten richtig empfangen???
 
Zitat:

Zitat von romber
Bei Response handelt es sich um XML-Daten. XML-Header enthält keine Encoding-Attribute.

Delphi-Quellcode:
<?xml version="1.0" [b]encoding="UTF-8"[/b] standalone="yes"?>
<verzeichnis>
     <titel>Wikipedia Städteverzeichnis</titel>
     <eintrag>
          <stichwort>Genf</stichwort>
          <eintragstext>Genf ist der Sitz von ...</eintragstext>
     </eintrag>
     <eintrag>
          <stichwort>Köln</stichwort>
          <eintragstext>Köln ist eine Stadt, die ...</eintragstext>
     </eintrag>
</verzeichnis>
Das 'encoding' ist ein Attribut und es steht in der XML-Deklaration (optional) ;)

Daneben gibt es in der Response eventuell auch noch eine Encoding Angabe im HTTP Header, die dazu passen muss.

romber 21. Feb 2010 19:20

Re: Unicode-Daten richtig empfangen???
 
Zitat:

Zitat von mjustin
Daneben gibt es in der Response eventuell auch noch eine Encoding Angabe im HTTP Header, die dazu passen muss.

UTF-8 steht im Header.
Eingentlich vertsehe ich das alles nicht ganz. Umlaute und sogar seltene spanische und französiche werden angezeigt, das sind doch auch alles Unicode-Zeichen, oder?
Noch Ideen?

romber 22. Feb 2010 10:41

Re: Unicode-Daten richtig empfangen???
 
Ich werde verrückt mit dieser Unicode, echt! Haben die aktuelle Indys immer noch Probleme mit Unicode oder wo liegt das Problem?

tinof 22. Feb 2010 13:49

Re: Unicode-Daten richtig empfangen???
 
Zitat:

Diese Zeichen gehen verloren und werden durch Fragezeichen ersetzt.
Wo? Im Debugger gesehen oder bei der Weiterverarbeitung - z.B. savetofile() o.ä.?

Für Savetofile() gibt es beispielsweise jetzt überladene Versionen, bei denen man das Encoding mit angeben kann, so in der Art

Delphi-Quellcode:
responsestream.savetofile('meinfile.txt',TEncoding.UTF8)
(Bitte in der Hilfe die genaue Syntax nachschlagen).


Viel Erfolg!

Tino

P.S. Unicode & Delphi9 und Indy 10x geht prinzipiell, es ist imho kein Bug oder Versionsproblem.

romber 22. Feb 2010 16:27

Re: Unicode-Daten richtig empfangen???
 
Zitat:

Zitat von tinof
Wo? Im Debugger gesehen oder bei der Weiterverarbeitung - z.B. savetofile() o.ä.?

Beim SaveToFile bekomme ich schon die Fragezeichen.
Es ist einfach zum k...zen mit diesem Unicode!
Leute! Hilfe! Was muss ich dem IdHTTP beibringen, damit er Unicode-Seiten richtig liefert?

Assertor 22. Feb 2010 16:55

Re: Unicode-Daten richtig empfangen???
 
Hi romber,

Zitat:

Zitat von romber
Ich sende mit IdHTTP Anfragen an einen Webservice an und erhalte die Daten, die auch Unicode-Zeichen enthalten. Diese Zeichen gehen verloren und werden durch Fragezeichen ersetzt. Wie empfange ich die Unicode-Daten richtig?

Zitat:

Zitat von romber
Leute! Hilfe! Was muss ich dem IdHTTP beibringen, damit er Unicode-Seiten richtig liefert?

Nichts. Hat auch nichts mit Indy zu tun: Schau Dir ggf. mal die Delphi Hilfe in Delphi 2009/2010 für TStringStream.Create() an:

Per Default sind StringStreams & Co mit Encoding vom Typ TEncoding.ASCII erzeugt.

Du erzeugst also einen ASCII (!) StringStream und füllst diesen mit Unicode Daten (in diesem Fall wahrscheinlich UTF8). Das das jetzt Indy ist, was den Stream füllt, ist für das Problem egal.

Delphi-Quellcode:
ResponseStream := TStringStream.Create('', TEncoding.UTF8); // <-- Encoding setzten!
RequestStream := TStringStream.Create; // hier ggf. auch
RequestStream.WriteString(SERVICE_REQUEST_XML);
try
  http.Post(WEB_SERVICE_URL, RequestStream, ResponseStream);
except
...
end;
[Abschweifen]
Du hast hier an verschiedenen Stellen mögliche Encodings:

Client:
- RequestStream (Delphi)
- RepsonseStream (Delphi)
- HTTP Transfer Klasse (Indy)

Server
- Webseiten Encoding
- Form Encoding (kann von Webseitenencoding abweichen!)

Beiseitig:
- Das Datei Encoding des XML und zusätzlich auch das Inline Encoding (aus dem XML Tag)

Um die Verwirrung komplett zu machen, gibt es in Indy auch noch die Content Charsets und Encodings.
[/Abschweifen]


Hab aber gerade Deinen Code getestet - funktioniert mit UTF8 ohne Probleme.

Gruß Assertor

romber 22. Feb 2010 21:40

Re: Unicode-Daten richtig empfangen???
 
Super! An den Indys lag es wirklich nicht, habe umsonst geschimpft :-)
Habe der Stream das Encoding gesetzt, wie Assertor empfohlen hat, und schon ging's.

Vielen Dank an alle!

Assertor 23. Feb 2010 15:36

Re: Unicode-Daten richtig empfangen???
 
Hi romber,

Zitat:

Zitat von romber
Super! An den Indys lag es wirklich nicht, habe umsonst geschimpft :-)
Habe der Stream das Encoding gesetzt, wie Assertor empfohlen hat, und schon ging's.

Das freut mich und danke für das Feedback!

Gruß,
Assertor

:dp:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:07 Uhr.

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