![]() |
AW: Unicode strings
Entweder du benutzt einen Send-Befehl, welcher keinen String verwendet.
=> Buffer (VAR ohne Typ), TBytes, einen TStream oder einzeln Byte für Byte Oder du speicherst deinen Text in einem AnsiString. Bei Übergabe wird der dann nach Unicode konvertiert und vom IdTextEncoding, hoffentlich mit der richtigen CodePage (0 = CP_ACP) wieder in zurück Ansi, wobei dann hoffentlich alle Bytes wieder so sind, wie sie waren/sollen. Oder du probierst es mit einem RawByteString. Vor Übergabe sicherheitshalber nochmal mit ![]() Und dann beim Senden ein IIdTextEncoding mit der CodePage $ffff verwenden. (ich hoffe die können damit umgehen) |
AW: Unicode strings
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:
2. Konvertieren vor dem Senden.
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; Das ist einwenig "riskant", abhängig von den Daten (siehe weiter unten)
Code:
Probleme bringt diese Version immer dann wenn du Zeichen ausserhalb des Ansi-Bereichs senden möchtest also etwa:
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;
Code:
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.
CHeaderu='öÖäß...'
|
AW: Unicode strings
Zitat:
Hat man entsprechende Klassen/Helperunits muss man sich um Charactercodierung nur an wenigen Stellen Quellcode Gedanken machen. Zitat:
Zitat:
Zitat:
Zitat:
Glücklicherweise hat Emba/Delphi den Weg genommen mit Unicodestrings zu arbeiten statt hier eine Krückenlösung ala FreePascal mit UTF8 zu realisieren. Da wo man sich Delphi XEx keine Gedanken mehr machen muss bezüglich Dateizugriff und Sonderzeichen in Dateinamen, muss man bei Freepascal noch überlegen ob man nun die Funktion mit oder ohne UTF8/native im Namen verwendet. |
AW: Unicode strings
Zitat:
Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:59 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