![]() |
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). |
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: ![]() |
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. |
AW: Ansi Encoding ohne Leerzeichen
Zitat:
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? |
AW: Ansi Encoding ohne Leerzeichen
Habe gerade mal in meinem ollen Delphi 7 probiert:
Delphi-Quellcode:
Das liefert mir
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;
Code:
Daraus schließe ich jetzt einfach mal (bitte korrigiert mich):
s = 4, s1 = 2, s255 = 256, sShort = 256
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. |
AW: Ansi Encoding ohne Leerzeichen
ich schreibe das jetzt alles so
Delphi-Quellcode:
Datei wird wie folgt erzeugt, damit es passt
aText := Datetimetostr(now) + ' ' + aText + linefeed;
aByteArr := TEncoding.Utf8.GetBytes(aText); //FStream.Write(aText[1], length(aText) * Sizeof(aText[1]) ); FStream.WriteData(aByteArr, Length(aByteArr));
Delphi-Quellcode:
Ich öffne mehrere (wenige und kleine)Logfiles und hänge sie hintereinander in einen String.
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;
Delphi-Quellcode:
Dann erzeuge ich aus dem String eine einzige Datei für ein Email Attchment.
aText := aText + TFile.ReadAllText(flogfile,Tencoding.UTF8);
Delphi-Quellcode:
Diese Datei kann ich dann tatsächlich per notepad.exe öffnen.
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; Problem ist also gelöst.. und viel über kodierung und strings dabei gelernt. |
AW: Ansi Encoding ohne Leerzeichen
Zitat:
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. |
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