Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi Ansi Encoding ohne Leerzeichen (https://www.delphipraxis.net/193481-ansi-encoding-ohne-leerzeichen.html)

himitsu 7. Aug 2017 15:10

AW: Ansi Encoding ohne Leerzeichen
 
Jain.

String ist ein Delphi-String mit Unicode (seit 2009)
Delphi-Strings haben eine Längenangabe (wie in dynamisches "Array of Char"), außerdem besitzen sie aus Kompatibilitätsgründen und für "einfache" PChar-Casts auch eine implizit abschließende Doppel-Null (#0#0).

nahpets 7. Aug 2017 15:11

AW: Ansi Encoding ohne Leerzeichen
 
Kenne mich da nicht mit aus, aber ist nicht inzwischen alles, was nicht im Bereich von String[1] bis String[255] liegt, ein nullterminierter String?
Aus die Schnelle fand ich das: http://www.delphipraxis.net/166685-s...erminiert.html

himitsu 7. Aug 2017 15:55

AW: Ansi Encoding ohne Leerzeichen
 
Nein.

String (Delphi 1) und String[Länge] nennen sich jetzt "ShortString" und das ist ein Record/StaticArray mit einem Längen-Byte auf Char[0]. (darum fangen in Delphis Strings auch bei 1 an)

Der LongString, aka String, AnsiString und UnicodeString, ist ein aufgemotztes dynamisches Array (array of char), mit CodePage neben dem Längen-Integer und hinten ein implizites #0#0.

QuickAndDirty 7. Aug 2017 15:57

AW: Ansi Encoding ohne Leerzeichen
 
Zitat:

Zitat von himitsu (Beitrag 1378271)
Jain.

String ist ein Delphi-String mit Unicode (seit 2009)
Delphi-Strings haben eine Längenangabe (wie in dynamisches "Array of Char"), außerdem besitzen sie aus Kompatibilitätsgründen und für "einfache" PChar-Casts auch eine implizit abschließende Doppel-Null (#0#0).

:(

Hm, dessen war ich mir nicht bewusst.

So ein bisschen ärgert es mich auch. Aber gut, genau hinsehen hätte mir sowas ja auch verraten.
bekomme ich die doppelnullterminierung auch vom Tstringhelper.toCharArray und Tencoding.unicode.Getbytes ?

Sprich was ist der richtige Buffer für filestream write?

nahpets 7. Aug 2017 17:03

AW: Ansi Encoding ohne Leerzeichen
 
Habe gerade mal in meinem ollen Delphi 7 probiert:
Delphi-Quellcode:
var
  s1     : String[1];
  s255   : String[255];
  s     : String;
  sShort : ShortString;
begin
  ShowMessage(Format('s = %d, s1 = %d, s255 = %d, sShort = %d',  [SizeOf(s),SizeOf(s1),SizeOf(s255),SizeOf(sShort)]));
end;
Das liefert mir
Code:
s = 4, s1 = 2, s255 = 256, sShort = 256
Daraus schließe ich jetzt einfach mal (bitte korrigiert mich):

String[255] entspricht ShortString, String[1] bis String[255] verhalten sich wie schon beim alten Turbopascal. (Array of Char, bei dem an Position 0 die Längenangabe des tatsächliche genutzten Teils des Arrays steht.)

String ist, wie himitsu beschrieb, eine nullterminierte Zeichenfolge.

QuickAndDirty 7. Aug 2017 17:16

AW: Ansi Encoding ohne Leerzeichen
 
ich schreibe das jetzt alles so
Delphi-Quellcode:
      aText := Datetimetostr(now) + ' ' + aText + linefeed;
      aByteArr := TEncoding.Utf8.GetBytes(aText);
      //FStream.Write(aText[1], length(aText) * Sizeof(aText[1]) );
      FStream.WriteData(aByteArr, Length(aByteArr));
Datei wird wie folgt erzeugt, damit es passt
Delphi-Quellcode:
    if not TFile.Exists(fLogFile) then
    Begin
      FileOpenMode := fmCreate;
      fStream := TFileStream.create( self.fLogFile, FileOpenMode );
      Preambel := Tencoding.UTF8.GetPreamble;
      fStream.WriteData(Preambel,length(Preambel));
      fStream.free;
    End;
Ich öffne mehrere (wenige und kleine)Logfiles und hänge sie hintereinander in einen String.
Delphi-Quellcode:
  aText := aText + TFile.ReadAllText(flogfile,Tencoding.UTF8);
Dann erzeuge ich aus dem String eine einzige Datei für ein Email Attchment.
Delphi-Quellcode:
function TLog.Internal_GetEmailFile: String;
var alogtext:String;
begin
  result := '';
  Internal_ReadFile(alogtext);
  alogtext := aLogtext.Replace(''+linefeed, ''+carriageReturn+''+linefeed, [rfReplaceAll] );//für Notepad.exe
  alogtext := alogtext.Replace(''#0,'',[rfReplaceAll]);//einfach zur sicherheit.
  if tFile.Exists(fEmailFile) then
    Tfile.Delete(fEmailFile);
  TFile.WriteAllText(femailfile,aLogText, TEncoding.UTF8 );//erzeugt eine UTF8 Preambel (BOM)
  result := femailfile;
end;
Diese Datei kann ich dann tatsächlich per notepad.exe öffnen.

Problem ist also gelöst..
und viel über kodierung und strings dabei gelernt.

himitsu 7. Aug 2017 19:39

AW: Ansi Encoding ohne Leerzeichen
 
Zitat:

Zitat von nahpets (Beitrag 1378289)
Daraus schließe ich jetzt einfach mal (bitte korrigiert mich):

String[255] entspricht ShortString, String[1] bis String[255] verhalten sich wie schon beim alten Turbopascal. (Array of Char, bei dem an Position 0 die Längenangabe des tatsächliche genutzten Teils des Arrays steht.)

String ist, wie himitsu beschrieb, eine nullterminierte Zeichenfolge.

Der Typ (Type-Definition) ShortString entspricht String[255].
String[1] bis String[255] sind ShortString (DatenFormat-Definition).

Und LongString (AnsiString und UnicodeString) sowie WideString arbeiten mit Längen-Bytes/Integern, aber haben auch PChar-Charakteristiken drin, die aber vom String selber nicht verwendet werden.
WideString ist fast so wie LongString, nur etwas Einfacher und es wird von der OleAuth32.dll verwaltet. (WinAPI und deren SpeicherManager)

Delphi-Quellcode:
var
  S1, S2, S3: string;

S1 := 'abc'#0'def';
S2 := Copy(S1); // S2 := S1; ... damit auch wirklich der Inhalt kopiert wird, da LongStrings referenzverwaltet sind und sonst nur den Pointer, aber nicht den Inhalt kopieren
S3 := PChar(S1);
ShowMessage(Format('%d %d %d', [Length(S1), Length(S2), Length(S3)]));


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:27 Uhr.
Seite 2 von 2     12   

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