Autor |
Beitrag |
W4yne
      
Beiträge: 50
|
Verfasst: Mi 04.02.09 14:49
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
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mi 04.02.09 14:55
Hallo und  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.
_________________ We are, we were and will not be.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 50
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 50
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 50
|
Verfasst: Mi 04.02.09 16:05
Danke das wäre sehr nett 
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 04.02.09 16:24
So, da war doch etwas, ich habe gerade mein Testprogramm wiedergefunden (Volltext-indizierter Festplatte sei Dank  ).
Benutzt du zufällig ReceiveText zum Empfangen? Das ist leider bei D2009 fehlerhaft, du musst ReceiveBuf benutzen.
|
|
W4yne 
      
Beiträge: 50
|
Verfasst: 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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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.  Bei langsamen Verbindungen (Internet, ausgelasteter Server, volle Leitung, etc.) wird dir das irgendwann um die Ohren fliegen!
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
W4yne 
      
Beiträge: 50
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 50
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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:
forums.codegear.com/...essageID=70567#40878
|
|
W4yne 
      
Beiträge: 50
|
Verfasst: Mi 04.02.09 20:16
Danke, danke danke danke.
Es funktioniert endlich. Juhuhuhu
Danke viel mals
mfg W4yne
|
|