AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

AnsiString speichern und laden

Ein Thema von Willie1 · begonnen am 9. Mär 2021 · letzter Beitrag vom 16. Mär 2021
Antwort Antwort
Seite 2 von 3     12 3   
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.604 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: AnsiString speichern und laden

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

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

finally
  F.Free;
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
551 Beiträge
 
Delphi 10.1 Berlin Starter
 
#12

AW: AnsiString speichern und laden

  Alt 11. Mär 2021, 17: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 17:36 Uhr)
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
387 Beiträge
 
Delphi 10.3 Rio
 
#13

AW: AnsiString speichern und laden

  Alt 11. Mär 2021, 19: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 19:09 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.604 Beiträge
 
Delphi 10.4 Sydney
 
#14

AW: AnsiString speichern und laden

  Alt 11. Mär 2021, 19: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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

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

Registriert seit: 28. Mai 2008
551 Beiträge
 
Delphi 10.1 Berlin Starter
 
#15

AW: AnsiString speichern und laden

  Alt 12. Mär 2021, 18:02
Da habe ich einiges zu lesen (bzw. vorlesen zu lassen) !
In europäischen Sprachen wird doch das zweite Byte nicht gebraucht, richtig?
Willie.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.604 Beiträge
 
Delphi 10.4 Sydney
 
#16

AW: AnsiString speichern und laden

  Alt 12. Mär 2021, 18:13
ä ö ü ß

oder z.B. bei den Franzosen und Dergleichen auch é ê ë ì í î ï ñ ò ó ô õ ö ... , was nicht alles in die 255 rein passt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

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

Registriert seit: 19. Jun 2006
387 Beiträge
 
Delphi 10.3 Rio
 
#17

AW: AnsiString speichern und laden

  Alt 12. Mär 2021, 18:21
Doch da gibt es auch solche Zeichen. Z.B. das Euro Zeichen hat den Wert $20AC.

Hier gibt es ein White Paper von Emba zu Unicode mit Delphi und was man da für die Migration beachten muss:
White Paper: Delphi and Unicode

Oder das hier:
Delphi Unicode Migration for Mere Mortals

Lies dir diese PDF's mal durch und dann wird schon vieles viel einfacher verständlich sein.

Es gibt übrigens bei Embarcadero einen eigenen Bereich für die Migration, wo auch auf das Thema Unicode Migration eingegangen wird. Hier findest du die Seite und weitere Links zum Thema:
https://www.embarcadero.com/rad-in-a...upgrade-center

Geändert von Rolf Frei (12. Mär 2021 um 18:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.061 Beiträge
 
Delphi 10.3 Rio
 
#18

AW: AnsiString speichern und laden

  Alt 12. Mär 2021, 21:14
Willie möchte aber nicht aus Ansicode Unicode machen, er hat lediglich den falschen Datentyp für sein Experiment genutzt.
TBytes nennt es sich heute, damals halt array of byte .

Ich kenne die Problematik, da auch ich mich mal fürs falsche Entschieden hatte.
Eine sofort Korrektur mit minimal Aufwand wäre halt per Base64 möglich. Encode(AnsiString) / Decode(Base64String) o.ä..
Jedenfalls hatte ich mich damals dafür Entschieden und würde es wahrscheinlich wieder machen ;-]

Ebenfalls möglich ohne viel Aufwand auf einen TStream umzusatteln.

Das ganze total Oldskool als Record laden/speichern ginge auch. Da muss halt im Record der Typ stimmen.

Also es gibt viele Möglichkeiten so das Dein En-/Kodierverfahren weiterhin genutzt werden kann, nur außen rum brauchst Du halt was anderes.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
551 Beiträge
 
Delphi 10.1 Berlin Starter
 
#19

AW: AnsiString speichern und laden

  Alt 14. Mär 2021, 19:30
Viele gute Antworten. Danke.
Aber ich schaffe es nicht, die Nibbles so zu verknüpfen, wie ich mir das vorgestellt habe. Ich erkenne nicht, ob der Fehler am Codieren oder Decodieren liegt. Ich habe die Bereichsprüfung eingeschaltet, um einen Überlauf zu erkennen. Ist aber nicht.

Willie.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.604 Beiträge
 
Delphi 10.4 Sydney
 
#20

AW: AnsiString speichern und laden

  Alt 14. Mär 2021, 19:39
Es gibt verschiedene Einstellungen für TEncoding bzw. WideCharToMultiByte und standardmäßig gibt es keine Fehlermeldung, wenn es nicht passt.
https://www.delphipraxis.net/207225-...evexpress.html

Und die Bereichsprüfung kann hier nicht greifen, dass die Chars nicht einzeln im Delphi-Code von WideChar ins AnsiChar zugewiesen werden.

Bestes Beispiel: Delphi-Referenz durchsuchenUTF8Decode und seine Freunde geben einfach still und heimlich einen Leerstring zurück, wenn man man dort "ungültiges" UTF-8 reingibt.
Und standardmäßig werden eben ungültige unpassende WideChars in ein '?' übersetzt, wenn es nicht passt. (bei den AutoCatst still und heimlich, da Rückgaben nicht geprüft werden)

Außerdem kann es sein, dass Combining-Chars zusammengefasst werden, aber zurück dann nicht wieder getrennt. Oder A mit Akzent wird in ein pures A übersetzt und zurück geht dann nicht mehr.
Aber hier kann man mit den passenden Optionen und Auswertung des Rückgabewertes entgegengewirkt werden.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (14. Mär 2021 um 19:49 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 14:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf