AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung Delphi Ansi Encoding ohne Leerzeichen
Thema durchsuchen
Ansicht
Themen-Optionen

Ansi Encoding ohne Leerzeichen

Ein Thema von QuickAndDirty · begonnen am 4. Aug 2017 · letzter Beitrag vom 7. Aug 2017
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu

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

AW: Ansi Encoding ohne Leerzeichen

  Alt 7. Aug 2017, 15:10
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).
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#12

AW: Ansi Encoding ohne Leerzeichen

  Alt 7. Aug 2017, 15:11
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Ansi Encoding ohne Leerzeichen

  Alt 7. Aug 2017, 15:55
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 7. Aug 2017 um 16:02 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#14

AW: Ansi Encoding ohne Leerzeichen

  Alt 7. Aug 2017, 15:57
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?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#15

AW: Ansi Encoding ohne Leerzeichen

  Alt 7. Aug 2017, 17:03
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.
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#16

AW: Ansi Encoding ohne Leerzeichen

  Alt 7. Aug 2017, 17:16
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.
  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.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Ansi Encoding ohne Leerzeichen

  Alt 7. Aug 2017, 19:39
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)]));
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 7. Aug 2017 um 19:46 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 02:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz