AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Unicode strings

Offene Frage von "p80286"
Ein Thema von eric_draven · begonnen am 8. Aug 2014 · letzter Beitrag vom 9. Aug 2014
 
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
446 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Unicode strings

  Alt 8. Aug 2014, 17:34
Ich habe auch eine uralte serielle Library beim Umstieg auf Delphi XE konvertiert und intern dafür AnsiString/AnsiChar/PAnsiChar verwendet, was ohne großen Aufwand über die Bühne ging (konvertieren auf TBytes hätte eine Menge mehr Arbeit bedeutet). Bei mir geht das problemlos weil intern Strings verwendet werden von außen aber Daten (Bytes/Word/DWord/Float) angeliefert werden.

Dein Problem liegt aber wohl darin, dass du diese Trennung nicht machen kannst weil du direkt im Programm mit den Strings arbeitest. Aus meiner Sicht gibts daher nur zwei Möglichkeiten:

1. Hardcast über AnsiString und AnsiChar für alles was mit dem Protokoll zu tun hat:

Code:
Const
  ETX = AnsiChar(2); //stellvertretend für alle Steuercodes....
  CHeader: AnsiString = #230'vorne'#231;

procedure TForm4.Button1Click(Sender: TObject);
Var
  Header: AnsiString;
begin
  Send(CHeader+AnsiString('Meine Daten'#$F3#$EE'hinten')+ETX);
end;


procedure TForm4.Send(AString: AnsiString);
begin
  //hier sollte alles passen
end;
2. Konvertieren vor dem Senden.
Das ist einwenig "riskant", abhängig von den Daten (siehe weiter unten)

Code:
Const
  ETXu = #2;
  CHeaderu = #230'vorne'#231;


procedure TForm4.Button2Click(Sender: TObject);
Var
  Header: String;
begin
  Sendu(CHeader+'Meine Daten'#$F3#$EE'hinten'+ETX)
end;

procedure TForm4.Sendu(AString: String);
Var
  iSend: AnsiString;
  i: Integer; // könnte auch TByte sein...
begin
  // konvertieren in AnsiString
  SetLength(iSend, Length(AString));
  for i := 0 to Length(AString) do
  begin
    iSend[i] := AnsiChar(AString[i]);
  end;
  // jetzt kann iSend übertragen werden...
end;
Probleme bringt diese Version immer dann wenn du Zeichen ausserhalb des Ansi-Bereichs senden möchtest also etwa:

Code:
CHeaderu='öÖäß...'
denn in deinem Code darfst du nur Zeichen bis 127 zwischen den Anführungszeichen verwenden, alles andere muss in der Form #xxx angegeben werden. Auch eine Wandlung von Unicode nach Ansi ist in Sendu() nicht möglich.
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:46 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