Entwickler-Ecke
Internet / Netzwerk - Delphi 2009 - Socket verwandelt String in mekrwürdige Schriftzeichen
W4yne - Mi 04.02.09 14:49
Titel: Delphi 2009 - Socket verwandelt String in mekrwürdige Schriftzeichen
Guten Morgen.
Ich versuche mithilfe eines Tutorials einen kleinen Chat in Delphi zu programmieren.
Nun mein Problem: Sobald ich mit dem Befehl ClientSocket1.Socket.SendText
einen Text an den Server sende, wird dieser String dann beim Server als Japanische/Chinesische Schriftzeichen ausgeben. Woran liegt das?
mfg
W4yne
PS: Ich habe schon nachdem Problem gegoogelt aber nirgends etwas gefunden. Ich hoffe ihr könnt mir das erklären.
Gausi - Mi 04.02.09 14:55
Hallo und :welcome: in der Entwickler-Ecke
Das Problem dürfte darauf zurückzuführen sein, dass ein "String" in Delphi 2009 etwas anderes ist als in den früheren Delphi-Versionen.
Früher war ein "String" ein "AnsiString", d.h. jedes Zeichen wurde mit einem Byte codiert. Mit Delphi 2009 wurde Unicode-Unterstützung eingebaut, und seitdem sind alle Strings WideStrings (oder UnicodeStrings?), d.h. jedes Zeichen wird mit 2 Bytes kodiert (oder ist ein String ein UTF8-kodierter String?).
Man muss da also ggf. den Code abändern, z.B. indem man alle Strings im alten Code durch AnsiStrings ersetzt.
jaenicke - Mi 04.02.09 15:17
Gausi hat folgendes geschrieben : |
| und seitdem sind alle Strings WideStrings (oder UnicodeStrings?) |
UnicodeString ist der Typ. ;-)
Der Unterschied zwischen UnicodeString und WideString ist, dass WideString keinen Referenzzähler hat. Ein UnicodeString hat aber einen, das ist genau wie bei einem AnsiString, deshalb wurde der neue Typ eingeführt.
W4yne - Mi 04.02.09 15:39
Titel: AnsiString
Danke zuert für die schnelle antwort :)
Soweit hab ich es verstanden, nur weiß ich jetzt nicht was ich genau verändern soll. Ich habe Variablen definieren nur in Delphi 5 gelernt und deswegen bin ich jetzt leich verwirrt. Das is der vereinfachte Code
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; ClientSocket1: TClientSocket; ApplicationEvents1: TApplicationEvents; Edit2: TEdit; Label1: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin ClientSocket1.Host:=Edit2.text; ClientSocket1.Active:=true; ClientSocket1.Socket.SendText(Edit2.Text); |
Was genau muss ich jetzt mit Edit2.text anstellen? Ich habe es schon versucht in einen AnsiString zu verwandeln, doch dann bleiben die Japanischen Schriftzeichen.
Moderiert von
Gausi: Delphi-Tags hinzugefügt
jaenicke - Mi 04.02.09 15:42
Titel: Re: AnsiString
W4yne hat folgendes geschrieben : |
| Was genau muss ich jetzt mit Edit2.text anstellen? Ich habe es schon versucht in einen AnsiString zu verwandeln, doch dann bleiben die Japanischen Schriftzeichen. |
Wie hast du das denn gemacht? Deklariere doch eine AnsiString Variable und schau dann vorher deren Inhalt an.
W4yne - Mi 04.02.09 15:55
Meinst du ungefähr so?
Delphi-Quelltext
1: 2:
| var a: Ansistring; a:=AnsiString(Edit2.text) |
Wenn ja ich habe es so versucht und es hat nicht geklappt.
Moderiert von
Narses: Delphi-Tags hinzugefügt
jaenicke - Mi 04.02.09 15:59
Dabei fällt mir etwas ein. Ein ähnliches Problem gab es hier schon mal glaube ich. Und da war was mit den Socketkomponenten. Die sind ja mit Delphi 2009 mitgeliefert, aber irgendwas war da, ich muss das mal suchen.
W4yne - Mi 04.02.09 16:05
Danke das wäre sehr nett :)
jaenicke - Mi 04.02.09 16:24
So, da war doch etwas, ich habe gerade mein Testprogramm wiedergefunden (Volltext-indizierter Festplatte sei Dank :D).
Benutzt du zufällig ReceiveText zum Empfangen? Das ist leider bei D2009 fehlerhaft, du musst ReceiveBuf benutzen.
W4yne - Mi 04.02.09 16:27
Danke, habe mir schon gedacht dass da etwas nicht stimmt, da ich eigentlich alles richtig gemacht hatte.
Danke für die schnelle Hilfe :)
mfg
W4yne
Narses - Mi 04.02.09 18:35
Titel: Re: AnsiString
Moin!
Ähm, nochmal was zum Konzept der Socket-Komponenten:
W4yne hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TForm1.Button1Click(Sender: TObject); begin ClientSocket1.Host:=Edit2.text; ClientSocket1.Active:=true; ClientSocket1.Socket.SendText(Edit2.Text); | |
So ein Konstrukt ist (bei einem non-blocking-Socket) prinzipbedingt kaputt, da du nach einem Connect (was beim Schreiben auf .Active ausgelöst wird) erst warten musst, bis der Socket auch verbunden ist (Ereignis: OnConnect), bis du was senden darfst. :idea: Bei langsamen Verbindungen (Internet, ausgelasteter Server, volle Leitung, etc.) wird dir das irgendwann um die Ohren fliegen! :?
cu
Narses
W4yne - Mi 04.02.09 19:27
Ja weiß ich schon. Habe eh eine Verzögerung eingebaut, aber danke für den Hinweise :)
Wie gesagt, war der einfachte Code.
jaenicke - Mi 04.02.09 19:29
W4yne hat folgendes geschrieben : |
| Ja weiß ich schon. Habe eh eine Verzögerung eingebaut |
Verzögerung hört sich nach Sleep oder so an? Das wäre aber auch falsch.
Ereignisorientiert musst du das schon machen, wie
Narses geschrieben hat.
W4yne - Mi 04.02.09 19:49
Ok
Nur ich verstehe nicht genau wie man ClientSocket1.Socket.SendBuf verwendet. Die Hilfe bringt mich nicht wirklich voran.
jaenicke - Mi 04.02.09 20:07
Dass auch SendText kaputt ist, hatte ich glaube ich nicht festgestellt, ich glaube nur ReceiveText ist fehlerhaft. Aber ich werde das noch einmal ausprobieren.
Was den entsprechenden Quelltext angeht, so habe ich den entsprechenden Eintrag im Codegear-Forum wiedergefunden:
https://forums.codegear.com/thread.jspa?messageID=70567#40878
W4yne - Mi 04.02.09 20:16
Danke, danke danke danke.
Es funktioniert endlich. Juhuhuhu
Danke viel mals :)
mfg W4yne
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!