Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy TIdIRC Umlaute (https://www.delphipraxis.net/172852-indy-tidirc-umlaute.html)

Neotracer 25. Jan 2013 15:06

Indy TIdIRC Umlaute
 
Ich benutze Indy 10 und Delphi XE und dort die Komponente TIdIRC.

Wenn ich nun über IRC eine Nachricht mit Umlauten schicke, dann kommt totaler Müll an in dem Event "IRCPrivateMessage".

Beispiel. Ich schicke von einem anderen IRC-Client aus das Zeichen 'ä' und es kommt an "C$".
Hier sieht man es noch mal genauer:
http://www.abload.de/img/omgxhr18.jpg

Woran kann das liegen? Was kann ich dagegen tun?

Bernhard Geyer 25. Jan 2013 15:45

AW: Indy TIdIRC Umlaute
 
Aktuelles Build von Indy?
AFAIK gabs/gibts noch ein paar Bugs mit Unicode/Sonderzeichen

Neotracer 25. Jan 2013 16:13

AW: Indy TIdIRC Umlaute
 
Hmm. Wo kann ich das nachgucken?
Ich kann natürlich versuchen das neueste Indy 10 zu installieren. Das probiere ich mal, danke.

Trotzdem. Kann einer erkennen, was da schiefläuft? Und ob es ein Workaround gibt?

hesch21 8. Feb 2013 14:55

AW: Indy TIdIRC Umlaute
 
Ich habe leider dasselbe Problem mit der wirklich neuesten Version (10-4924 von gestern) und den TCPIP-Komponenten. Hässlich, aber plotzlich werden da z.B. bei einem IdTCPClient.SendCmd keine Umlaute mehr übermittelt, resp. beim Server kommen Fragezeichen an.
Das hat mit der früheren Version von Indy 10 noch funktioniert.
Ich habe mir jetzt folgendermassen beholfen, hoffe aber, ich könne das irgendwann wieder raus schmeissen.

Code:
IdTCPClient.SendCmd(Umlaute(Puffer, False), 200);
Code:
{Umlaute in Sende-Puffer umsetzen}
function TAServer1.Umlaute(InPuf: string; Read: boolean): string;
var i : integer;
begin
  result := '';
  if not Read then
     begin
     for i := 1 to length(InPuf) do
         result := result + String(IntToHex(Ord(InPuf[i]), 2));
     end
  else
     begin
     while length(InPuf) <> 0 do
           begin
           Result := Result + Char(StrToInt('$' + copy(InPuf,1, 2)));
           InPuf := copy(InPuf, 3, length(InPuf) - 2);
           end;
     end;
end;
Die Funktion setzt mit False alles in Hex-Notation um und mit True auf der Gegenseite wieder zurück.

Aber vielleicht hat ja jemand eine bessere Lösung. Irgendwie habe ich das Gefühl, man müsse vermütlich den Indys nur irgendwo das richtige Character Set beibringen, aber ich habe keine Ahnung, wo.

Neotracer 9. Feb 2013 16:20

AW: Indy TIdIRC Umlaute
 
Hey,

wie mein Vorredner schon sagte, habe ich die Probleme selbst mit den neusten Indys.
Dein Ansatz funktioniert in meinem Fall leider nicht, weil ich ja nicht die IRC Server umprogrammieren kann zu denen ich mich verbinde. :(

samso 9. Feb 2013 17:49

AW: Indy TIdIRC Umlaute
 
Ich würde den Versuch machen die Textcodierung zu setzen.

@hesch21
SendCmd(InPuf, 200, TIdTextEncoding.GetEncoding(1250))

@Neotracer
Bei der IRC-Komponente würde ich versuchen beim IOHandler.DefStringEncoding mal TIdTextEncoding.UTF8 oder TIdTextEncoding.GetEncoding(1250) zu setzen. Wenn ich den Quelltext richtig analysiert habe, müsste dort IndyASCIIEncoding gesetzt sein.

Neotracer 10. Feb 2013 17:58

AW: Indy TIdIRC Umlaute
 
@samso:

Vielen vielen Dank! Hat funktionier!
So habe ich es gemacht: Die Komponente TIdIoHandlerStack auf die Form ziehen und dann in den Propertys bei TIdIrc als IOHandler hinzufügen.
Dann wie erwähnt einfach die Zeile:
"IdIRC1.IdIOHandlerStack1.DefStringEncoding := TIdTextEncoding.UTF8;" irgendwo bevor man connected hinzufügen.

:thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:29 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