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
Antwort Antwort
eric_draven

Registriert seit: 26. Jul 2007
15 Beiträge
 
#1

AW: Unicode strings

  Alt 8. Aug 2014, 14:37
hmmm, AnsiStrings, Codepages, Shortstrings hatte ich schon alles probiert. Das mit dem RawByteString hört sich gut an, funktioniert aber immer noch nicht . Alles was grösser Ord(127) ist, wird in irgendeinen sinnlosen Wert gewandelt, z.B. $ff => $3f.
Im diesem konkreten Beispiel rufe ich die UDPClient.Send Funktion von Indy auf, wenn man diese verfolgt, sieht die so aus:
Code:
procedure TIdUDPClient.Send(const AData: string; AByteEncoding: IIdTextEncoding = nil
  {$IFDEF STRING_IS_ANSI}; ASrcEncoding: IIdTextEncoding = nil{$ENDIF}
  );
begin
  Send(Host, Port, AData, AByteEncoding{$IFDEF STRING_IS_ANSI}, ASrcEncoding{$ENDIF});
end;
Pseudo-Aufruf:
UDPClient.Send(RawByteString(....));
Also Encoding = nil
  Mit Zitat antworten Zitat
eric_draven

Registriert seit: 26. Jul 2007
15 Beiträge
 
#2

AW: Unicode strings

  Alt 8. Aug 2014, 14:41
ah, Himitsu, Du hast mittlerweile nochmal geschrieben. Genau so ist es, 0..127 alles OK, darüber = blödsinn.
Die Bytes sind immer als zweier hex komplementäre geschrieben, z.B. #$00, #$FF, ...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.360 Beiträge
 
Delphi 12 Athens
 
#3

AW: Unicode strings

  Alt 8. Aug 2014, 14:47
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 Delphi-Referenz durchsuchenSetCodePage die CodePage auf $ffff setzen.
Und dann beim Senden ein IIdTextEncoding mit der CodePage $ffff verwenden. (ich hoffe die können damit umgehen)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Whookie

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

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
Antwort Antwort


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