Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IdUDPServer: Probleme mit Sonderzeichen bei read (https://www.delphipraxis.net/216247-idudpserver-probleme-mit-sonderzeichen-bei-read.html)

Helmi 27. Nov 2024 07:34

IdUDPServer: Probleme mit Sonderzeichen bei read
 
Hallo Zusammen,

ich nutze von den Indy-Komponenten den IdUDPServer.

Soweit funktioniert alles.
Nur hab ich das Problem, dass Sonderzeichen, wie z. B. das Eurozeichen (€) nicht richtig angezeigt werden.
Als Fehlerquelle hab ich meine Read-Procedure ausgemacht.

Delphi-Quellcode:
procedure TMainForm.IdUDPServerUDPRead(AThread: TIdUDPListenerThread;
  AData: TArray<System.Byte>; ABinding: TIdSocketHandle);
var
  S: String;

begin
  SetString(S, PAnsiChar(@AData[0]), length(Adata));

  InfoForm.InfoText := trim(S);
end;
Da ich nur ein Byte pro Zeichen lese, kommt bei Sonderzeichen Murks raus.
Gibt es eine andere Möglichkeit?

Ich konnte in der Zwischenzeit rausfinden, dass richtig gesendet wird.
Konnte es mit PacketSender (packetsender.com) gegentesten.

Michael II 27. Nov 2024 14:32

AW: IdUDPServer: Probleme mit Sonderzeichen bei read
 
https://stackoverflow.com/questions/...9%20character.

himitsu 27. Nov 2024 15:15

AW: IdUDPServer: Probleme mit Sonderzeichen bei read
 
Delphi-Quellcode:
S := TEncoding.irgendwas.GetString(AData);

Helmi 27. Nov 2024 15:38

AW: IdUDPServer: Probleme mit Sonderzeichen bei read
 
Zitat:

Zitat von himitsu (Beitrag 1543600)
Delphi-Quellcode:
S := TEncoding.irgendwas.GetString(AData);

Danke - genau das war es (genauer:
Delphi-Quellcode:
S := TEncoding.UTF8.GetString(AData);
)

himitsu 27. Nov 2024 17:56

AW: IdUDPServer: Probleme mit Sonderzeichen bei read
 
Zitat:

Zitat von Michael II (Beitrag 1543598)

Ach ja, man mag es nicht glauben ... ich war auch vor Schreck aus allen Wolken gefallen ... aber es gibt wirklich ein SetString, welches einen PAnsiChar an einen String/UnicodeString zuweist. :freak:


Da es hier nun UTF-8 ist (was man im ersten Post ja nicht erahnen konnte),
ist hier das Problem, dass dort der PAnsiChar als ANSI angesehn wird, anstatt UTF-8.

Mit dem passenden String-Typen funktioniert aber auch das.
Delphi-Quellcode:
var
  S: UTF8String;
begin
  SetString(S, PAnsiChar(@AData[0]), length(Adata));
UTF-8 ist ja eine bestimmte ANSI-Codepage.
Somit schreibt SetString das als ANSI ByteCode da rein
und beim Zuweisen an einen String/UnicodeString (hier ans Trim) wird dieser AnsiString-Typ dann entsprechend seiner CodePage (CP_UTF8) "richtig" dekodiert.

Oder AnsiString-Variable mit Delphi-Referenz durchsuchenSetCodePage, nach dem SetString.


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