AGB  ·  Datenschutz  ·  Impressum  







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

AnsiString speichern und laden

Ein Thema von Willie1 · begonnen am 9. Mär 2021 · letzter Beitrag vom 16. Mär 2021
Antwort Antwort
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
725 Beiträge
 
Delphi 10.3 Rio
 
#1

AW: AnsiString speichern und laden

  Alt 10. Mär 2021, 12:14
Du hast schon recht, momentan kann da nix schiefgehen. Interessant wird es erst wenn die Sache komplexer wird und man vergisst den Unsinn zu entfernen.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
703 Beiträge
 
Delphi 10.1 Berlin Starter
 
#2

AW: AnsiString speichern und laden

  Alt 10. Mär 2021, 18:10
Hallo,
danke für eure Tipps, ich habe lange ein altes Delphi benutzt, darum kenne ich noch nicht alle Verbesserungen.

Warum AnsiString statt WideString?
Ich hatte mir vor vielen Jahren eine einfache Verschlüsselung ausgedacht. Ich verknüpfe das 2. Nibble des 1. Bytes mit dem 1. Nibble des 2. Bytes usw. und zum Schluss noch das erste mit dem letzten Nibble. Nur als Teil der Verschlüsselung! Mit WideStrings macht das keinen Sinn.
Ich will auf keinen Fall jetzt eine Diskussion über Verschlüsselung anfachen! Das war nur eine Idee, die ich damals hatte und will sie mal ausprobieren.

Willie.

PS. with TFenster.Create do
try Showmodal finally Free end
benutze ich oft und sehe darin kein Problem, es spart Quelltext und ist übersichtlich.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.

Geändert von Willie1 (10. Mär 2021 um 18:21 Uhr) Grund: Nibble mit 2 b! Die Rechtschreibung hat aber nicht gemeckert.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: AnsiString speichern und laden

  Alt 10. Mär 2021, 18:22
Idee, verpack doch dein AnsiString in ein Base64 Encoding string.
Dann brauchst Du Dir um Unicode nicht mehr viele Gedanken machen.
Nur noch die eigene Lade/Speicher methode mit dem Base64 ergänzen, fertig.
(Es kann auch jede andere Base64 Lösung genommen werden, die ist halt bereits enthalten.)

Viel Erfolg!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: AnsiString speichern und laden

  Alt 10. Mär 2021, 18:58
Also hast du keinen AnsiString (CP_ACP) sondern einen RawByteString, oder besser noch ein TBytes.

Und vorallem mit Letzterem bereitet das TFile.WriteAllBytes keine Probleme.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
703 Beiträge
 
Delphi 10.1 Berlin Starter
 
#5

AW: AnsiString speichern und laden

  Alt 11. Mär 2021, 16:33
Also hast du keinen AnsiString (CP_ACP) sondern einen RawByteString, oder besser noch ein TBytes.

Und vorallem mit Letzterem bereitet das TFile.WriteAllBytes keine Probleme.
Du hast rect, ich brauche kein AnsiString. Memo.Text liefert jedoch WideString, bei dem jedes zweite Byte 0 ist. (war hier schon mal Thema) Gibt es einen Cast WideString to TByte? Ich bin nicht allein mit diesem Problem:https://support.industry.siemens.com.../219715?page=0 Inline-Variablen: ich muss immer noch dazulernen!

KodeZwerge, damit muss ich mich beschäftigen.

Willie.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.

Geändert von Willie1 (11. Mär 2021 um 16:36 Uhr)
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
655 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: AnsiString speichern und laden

  Alt 11. Mär 2021, 18:00
Du kannst da eifnach eine Typecast auf AnsiString machen:

Delphi-Quellcode:
var
  MeinAnsiStr: AnsiString;
  MeineBytes: TBytes;
begin
  MeinAnsiStr := AnsiString(Memo1.Lines.Text); // Kann zu Zeichenverlust führen, wenn ein Zeichen nicht im ANSI untersützt wird!
  MeineBytes := BytesOf(MeinAnsiStr);
  ...
end;
Du musst da aber aufpassen, denn wenn dein Memo Unicodezeichen enthält, die es im ANSI nicht gibt, wirst du da an der Stelle ein "?" haben. Da musst dir gründlich überlegen, ob du das da nicht anderst machen willst, damit keine Konvertierung Unicode/ANSI stattfinden muss.

Du könntest ja auch einfach alles als Unicode nutzen und verschlüsseln.

MeineBytes := BytesOf(Memo1.Lines.Text); In diesem Fall hast du ein ByteArray aus Unicodezeichen, also in der Regel sowas wie 40 00 45 00... Das könnte ja deine Routine auch auf Bytebene (wie bisher AnsiChar) vershlüsseln. StringOf(MeineBytes) macht dann übrigens das Gegenteil, also aus TBytes wieder ein String.

Geändert von Rolf Frei (11. Mär 2021 um 18:09 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: AnsiString speichern und laden

  Alt 11. Mär 2021, 18:30
Zitat:
Du musst da aber aufpassen, denn wenn dein Memo Unicodezeichen enthält
Jetzt rate mal, warum ich z.B. RawByteString genannt hatte.

Beim AnsiString (CP_ACP) ist vorallem besonders spaßig, dass bei unterschiedlichen Sprachen auch andere Zeichen codiert sind.
z.B. AnsiString-zu-String liefert ein anderes Ergebnis in Deutschland, Russland, China usw.



Ja, String/Char ist seit Delphi-2009 Unicode, genauer UnicodeString/WideChar mit 2 Byte pro Char.
Der WideString ist bissl was Anderes, hat aber die gleichen Chars drin.


Delphi-Referenz durchsuchenTEncoding

Delphi macht es ähnlich, beim Cast mit Unicode von/zu ANSI.
Ein AnsiString und seine Nachfahren haben seit 2009 eine CodePage.

AnsiString = CP_ACP / 0
UTF8String = CP_UTF8 / 65001
RawByteString = $FFFF

Auch UnicodeString hat quasi eine CodePage 1200
https://stackoverflow.com/questions/...01-12000-12001




https://www.delphipraxis.net/206950-...ml#post1482784
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (11. Mär 2021 um 20:32 Uhr)
  Mit Zitat antworten Zitat
stifflersmom

Registriert seit: 8. Dez 2005
Ort: 24994 Holt
384 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: AnsiString speichern und laden

  Alt 11. Mär 2021, 11:09
PS. with TFenster.Create do
try Showmodal finally Free end
benutze ich oft und sehe darin kein Problem, es spart Quelltext und ist übersichtlich.
Mit der Übersichtlichkeit ist's im Debugger dann aber nichts mehr...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: AnsiString speichern und laden

  Alt 11. Mär 2021, 11:38
Inzwischen gibt es ja nun die Inline-Variablen.

Delphi-Quellcode:
var F := TMyForm.Create(nil);
try

finally
  F.Free;
end;
Ein Therapeut entspricht 1024 Gigapeut.
  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 10:07 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