Autor Beitrag
W4yne
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 50



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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.

_________________
We are, we were and will not be.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 04.02.09 15:17 
user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 50



BeitragVerfasst: 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

ausblenden 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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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 user profile iconGausi: Delphi-Tags hinzugefügt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 04.02.09 15:42 
Titel: Re: AnsiString
user profile iconW4yne hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 50



BeitragVerfasst: Mi 04.02.09 15:55 
Meinst du ungefähr so?
ausblenden 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 user profile iconNarses: Delphi-Tags hinzugefügt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 50



BeitragVerfasst: Mi 04.02.09 16:05 
Danke das wäre sehr nett :)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 50



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 04.02.09 18:35 
Titel: Re: AnsiString
Moin!

Ähm, nochmal was zum Konzept der Socket-Komponenten:
user profile iconW4yne hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
W4yne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 50



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 04.02.09 19:29 
user profile iconW4yne hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconNarses geschrieben hat.
W4yne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 50



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 50



BeitragVerfasst: Mi 04.02.09 20:16 
Danke, danke danke danke.
Es funktioniert endlich. Juhuhuhu
Danke viel mals :)

mfg W4yne